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, но получих същия резултат. Ето прикачен файл с файла [link] drive.google.com/ файл/d/0B3MYgurAigDMdm1ESkZYWm9Zdms/   -  person user2779840    schedule 25.10.2017


Отговори (3)


Използвах вашия примерен ORC файл и се опитах да СЪЗДАМ външна таблица в HIVE, успях да видя изходните данни.

Hive Output

Можете също така да използвате помощната програма ORC Dump, за да се запознаете с метаданните на ORC файла във формат JSon.

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

Опитайте се да заредите данните, като използвате израза LOAD или създадете Managed Table, JFYI „Опитах ги всичките и получавах данните, както е показано по-долу“ :) Наистина не намирам нищо нередно в твърденията ви.

Можете също да проверите връзката за повече информация ORC Dump

person Joby    schedule 25.10.2017

Сблъсквам се със същия проблем с EMR Hive и orc файлове, намиращи се в s3. Проблемът беше в несъответствие между името на полето в схемата на orc и името на полетата на кошера.

В моя случай имената трябва да съвпадат на 100% (включително чувствителни към главни и малки букви) + имайте предвид, че кошерът ще преведе имената на полетата с камилски букви с малки букви.

Във вашия случай би било по-добре да създадете таблица като:

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 файл има име на колона с главни букви, тогава таблицата на кошера трябва да има същия регистър. Използвах рамка с данни на искра, за да конвертирам колоната в малки букви:

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