Hive兽人返回空值

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

我正在创建配置单元外部表orc(orc文件位于s3上)。
命令

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

运行查询后:

  1. Select * from Table1;

结果是:

  1. +-------------------------------------+---------------------------------------+
  2. | Table1.id | Table1.name |
  3. +-------------------------------------+---------------------------------------+
  4. | NULL | NULL |
  5. | NULL | NULL |
  6. | NULL | NULL |
  7. | NULL | NULL |
  8. | NULL | NULL |
  9. | NULL | NULL |
  10. | NULL | NULL |
  11. | NULL | NULL |
  12. | NULL | NULL |
  13. | NULL | NULL |
  14. +-------------------------------------+---------------------------------------+

有趣的是,返回的记录数是10,这是正确的,但所有记录都是空的。怎么了,为什么查询只返回空值?我正在aws上使用emr示例。我应该配置/检查以支持配置单元的orc格式吗?

nlejzf6q

nlejzf6q1#

我遇到的问题是配置单元表中列名的大小写,如果orc文件的列名是大写的,那么配置单元表的大小写应该相同。我使用spark数据框将列转换为小写:

  1. import findspark
  2. findspark.init()
  3. import pyspark
  4. from pyspark import SparkContext
  5. from pyspark.sql import SQLContext
  6. from pyspark import SparkConf
  7. from pyspark.sql import SparkSession
  8. import pandas
  9. from pyspark.sql import functions as F
  10. sc = SparkContext.getOrCreate()
  11. sqlContext = SQLContext(sc)
  12. orc_df=sqlContext.read.orc("hdfs://data/part-00000.snappy.orc")
  13. new_orc_df=orc_df.select([F.col(x).alias(x.lower()) for x in orc_df.columns])
  14. new_orc_df.printSchema()
  15. new_orc_df.write.orc(os.path.join(tempfile.mkdtemp(), '/home/hadoop/vishrant/data'), 'overwrite')
展开查看全部
ioekq8ef

ioekq8ef2#

我在s3中的emr hive和orc文件中遇到了相同的问题。问题是orc架构中的字段名和配置单元字段名不匹配。
在我的案例中,名称应该匹配100%(包括区分大小写)+注意,配置单元将以小写形式转换camelcase字段名称。
在这种情况下,最好创建如下表:

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

在创建.orc文件时,使用如下模式:

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

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

dluptydi

dluptydi3#

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

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

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

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

相关问题