我正在创建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格式吗?
答案 0 :(得分:0)
我确实使用了您的示例ORC文件并尝试在HIVE中创建外部表,我能够看到数据输出。
您还可以使用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')