【问题标题】:HIVE ORC returns NULLsHIVE ORC 返回 NULL
【发布时间】:2018-04-05 12:09:13
【问题描述】:

我正在创建 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 格式吗?

【问题讨论】:

标签: hive null emr orc


【解决方案1】:

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

您还可以使用 ORC Dump 实用程序来了解 JSON 格式的 ORC 文件的元数据。

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

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

您也可以查看链接了解更多信息ORC Dump

【讨论】:

    【解决方案2】:

    我在使用 s3 中的 EMR Hive 和 orc 文件时遇到了同样的问题。 问题在于 orc 架构中的字段名称与配置单元字段名称不匹配。

    在我的情况下,名称应匹配 100%(包括区分大小写)+ 请注意,hive 会将 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 能够从这些文件中读取值。

    【讨论】:

      【解决方案3】:

      我遇到的问题是 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')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-13
        • 1970-01-01
        • 2021-06-04
        相关资源
        最近更新 更多