HIVE ORC возвращает NULL

Я создаю внешнюю таблицу ORC куста (файл ORC, расположенный на S3).

Команда

CREATE EXTERNAL TABLE Table1 (Id INT, Name STRING) STORED AS ORC LOCATION 's3://bucket_name'

После выполнения запроса:

Select * from Table1;

Результат:

+-------------------------------------+---------------------------------------+
| Table1.id  | Table1.name  |
+-------------------------------------+---------------------------------------+
| NULL                                | NULL                                  |
| NULL                                | NULL                                  |
| NULL                                | NULL                                  |
| NULL                                | NULL                                  |
| NULL                                | NULL                                  |
| NULL                                | NULL                                  |
| NULL                                | NULL                                  |
| NULL                                | NULL                                  |
| NULL                                | NULL                                  |
| NULL                                | NULL                                  |
+-------------------------------------+---------------------------------------+

Интересно, что количество возвращаемых записей 10 и это правильно, но все записи NULL. Что не так, почему запрос возвращает только NULL? Я использую экземпляры EMR на AWS. Должен ли я настроить/проверить поддержку формата ORC для улья?


person user2779840    schedule 24.10.2017    source источник
comment
Ваши файлы в формате ORC? Пожалуйста, опубликуйте образец входного файла.   -  person Prabhat Ratnala    schedule 24.10.2017
comment
Да, я использую файл ORC. Я пытался создать внешнюю таблицу из s3 и из hdfs, но получил тот же результат. Вот вложение с файлом [ссылка] drive.google.com/ файл/d/0B3MYgurAigDMdm1ESkZYWm9Zdms/   -  person user2779840    schedule 25.10.2017


Ответы (3)


Я использовал ваш пример файла ORC и попытался СОЗДАТЬ внешнюю таблицу в HIVE, я смог увидеть вывод данных.

Вывод улья

Вы также можете использовать утилиту ORC Dump, чтобы узнать метаданные файла ORC в формате JSon.

hive --orcfiledump -j -p <Location of Orc File>

Попробуйте загрузить данные, используя оператор LOAD или создав Managed Table, JFYI «Я попробовал их все и получил данные, как показано ниже» :) Я действительно не нахожу ничего плохого в ваших утверждениях.

Вы также можете проверить ссылку для получения дополнительной информации Дамп ORC

person Joby    schedule 25.10.2017

Я столкнулся с той же проблемой с файлами EMR Hive и orc, расположенными в s3. Проблема заключалась в несоответствии имени поля в схеме orc и имени поля улья.

В моем случае имена должны совпадать на 100% (включая регистр) + обратите внимание, что hive будет переводить имена полей camelCase в нижний регистр.

В вашем случае было бы лучше создать таблицу, например:

CREATE EXTERNAL TABLE Table1 (id INT, name STRING) STORED AS ORC LOCATION 's3://bucket_name'  

И при создании файлов .orc используйте схему вроде:

private final TypeDescription SCHEMA = TypeDescription.createStruct()
            .addField("id", TypeDescription.createInt())
            .addField("name", TypeDescription.createString());

В этом случае имена полей Hive совпадают с именами полей в схеме orc, и EMR Hive смог прочитать значения из этих файлов.

person Vova Vasiuta    schedule 22.08.2019

Проблема, с которой я столкнулся, была связана с регистром имени столбца в таблице Hive, если в вашем файле ORC имя столбца указано в верхнем регистре, тогда таблица hive должна иметь тот же регистр. Я использовал фрейм данных искры, чтобы преобразовать столбец в нижний регистр:

import findspark
findspark.init()
import pyspark
from pyspark import SparkContext
from pyspark.sql import SQLContext
from pyspark import SparkConf
from pyspark.sql import SparkSession
import pandas
from pyspark.sql import functions as F

sc = SparkContext.getOrCreate()
sqlContext = SQLContext(sc)

orc_df=sqlContext.read.orc("hdfs://data/part-00000.snappy.orc")

new_orc_df=orc_df.select([F.col(x).alias(x.lower()) for x in orc_df.columns])
new_orc_df.printSchema()

new_orc_df.write.orc(os.path.join(tempfile.mkdtemp(), '/home/hadoop/vishrant/data'), 'overwrite')
person Vishrant    schedule 30.06.2020