HIVE ORC返回NULL

时间:2017-10-24 15:47:25

标签: hive null emr orc

我正在创建hive外部表ORC(位于S3上的ORC文件)。

命令

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? 我在AWS上使用EMR实例。我应该配置/检查以支持hive的ORC格式吗?

3 个答案:

答案 0 :(得分:0)

我确实使用了您的示例ORC文件并尝试在HIVE中创建外部表,我能够看到数据输出。

Hive Output

您还可以使用ORC转储实用程序以JSon格式了解ORC文件的元数据。

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

尝试使用LOAD语句加载数据或创建Managed Table,JFYI“我尝试了所有这些并获取如下数据”:)我真的没有发现您的语句有任何问题

您还可以查看链接以获取更多信息ORC Dump

答案 1 :(得分:0)

我遇到了与s3中的EMR Hive和orc文件相同的问题。 问题是orc架构中的字段名称和配置单元字段名称之间不匹配。

在我的情况下,名称应匹配100%(包括区分大小写)+请注意,配置单元将以小写形式转换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能够从那些文件中读取值。

答案 2 :(得分:0)

我遇到的问题是Hive表中列名的大小写,如果您的ORC文件的列名是大写,那么Hive表应该具有相同的大小写。我使用spark数据框将列转换为小写:

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')