Внешняя таблица Hive в файле AVRO, создающая только данные NULL для всех столбцов

Я пытаюсь создать Hive external table поверх некоторых файлов avro, которые генерируются с использованием spark-scala. Я использую CDH 5.16, у которого есть hive 1.1, spark 1.6.

Я создал hive external table, который успешно запустился. Но когда я запрашиваю данные, я получаю NULL для всех столбцов. Моя проблема похоже на это

После некоторых исследований я обнаружил, что это может быть проблема со схемой. Но я не смог найти файл схемы для этих файлов avro в этом месте.

Я новичок в типе файлов avro. Может кто-нибудь, пожалуйста, помогите мне здесь.

Ниже приведен фрагмент кода spark, где я сохранил файл как avro:

df.write.mode(SaveMode.Overwrite).format("com.databricks.spark.avro").save("hdfs:path/user/hive/warehouse/transform.db/prod_order_avro")

Ниже приведен мой оператор создания внешней таблицы улья:

create external table prod_order_avro
(ProductID string,
ProductName string,
categoryname string,
OrderDate string,
Freight string,
OrderID string,
ShipperID string,
Quantity string,
Sales string,
Discount string,
COS string,
GP string,
CategoryID string,
oh_Updated_time string,
od_Updated_time string
)
STORED AS AVRO
LOCATION '/user/hive/warehouse/transform.db/prod_order_avro';

Ниже приведен результат, который я получаю, когда запрашиваю данные: select * from prod_order_avro

Результат

В то же время, когда я читаю эти файлы avro, используя spark-scala как dataframe, и печатаю их, я получаю правильный результат. Ниже приведен код spark, который я использовал для чтения этих данных:

val df=hiveContext.read.format("com.databricks.spark.avro").option("header","true").load("hdfs:path/user/hive/warehouse/transform.db/prod_order_avro")

данные avro файлов при чтении через spark-scala

Мой вопрос,

  • Нужно ли мне при создании этих файлов avro изменять код spark
    для создания файлов схемы отдельно или он будет встроен
    в файлы. Если нужно отдельно, то как этого добиться?
  • Если нет, как создать таблицу hive, чтобы схема автоматически извлекалась из файла. Я читал, что в последней версии куст сам решает эту проблему, если в файлах присутствует схема.

Пожалуйста, помогите мне здесь


person Vaishak    schedule 17.07.2019    source источник


Ответы (1)


Решил это .. это была проблема со схемой. Схема не была встроена в файлы avro. Поэтому мне пришлось извлечь схему с помощью avro-tools и передать ее при создании таблицы. Теперь это работает.

Я выполнил следующие шаги:

  1. Извлечено несколько данных из avro файлов, хранящихся в hdfs, в файл в локальной системе. Ниже приведена команда, используемая для того же:

    sudo hdfs dfs -cat /path/file.avro | head --bytes 10K > /path/temp.txt

  2. Использована команда avro-tools getschema для извлечения схемы из этих данных:

    avro-tools getschema /path/temp.txt

  3. Скопируйте полученную схему (она будет в виде данных json) в новый файл с расширением .avsc и загрузите его в HDFS

  4. При создании Hive External table добавьте к нему следующее свойство:

    TBLPROPERTIES('avro.schema.url'='hdfs://path/schema.avsc')

person Vaishak    schedule 19.07.2019
comment
@Vaishak- Не могли бы вы обновить свой ответ, указав более подробную информацию. может быть полезно для нового человека. - person vikrant rana; 19.07.2019
comment
@vikrantrana я отредактировал свой ответ с более подробной информацией - person Vaishak; 19.07.2019