Hive兽人返回空值

tct7dpnv  于 2021-06-26  发布在  Hive
关注(0)|答案(3)|浏览(282)

我正在创建配置单元外部表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,这是正确的,但所有记录都是空的。怎么了,为什么查询只返回空值?我正在aws上使用emr示例。我应该配置/检查以支持配置单元的orc格式吗?

nlejzf6q

nlejzf6q1#

我遇到的问题是配置单元表中列名的大小写,如果orc文件的列名是大写的,那么配置单元表的大小写应该相同。我使用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')
ioekq8ef

ioekq8ef2#

我在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());

在本例中,配置单元字段名与orc架构中的字段名匹配,并且emr配置单元能够从这些文件中读取值。

dluptydi

dluptydi3#

我确实使用了您的示例orc文件,并尝试在配置单元中创建一个外部表,我能够看到数据输出。

您还可以使用orc dump实用程序来了解json格式的orc文件的元数据。

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

尝试使用 LOAD 语句或创建 Managed Table ,jfyi“我都试过了,得到的数据如下”:)我真的没有发现你的陈述有任何错误。
你也可以查看更多的orc转储信息的链接

相关问题