【问题标题】:Partitioned ORC table shows up empty in Hive分区的 ORC 表在 Hive 中显示为空
【发布时间】:2020-07-09 04:29:03
【问题描述】:

我已将 Spark 数据帧写入分区的 ORC 文件,如下所示:

df.repartition("LOADED")\
  .write\
  .partitionBy("LOADED")\
  .format("orc")\
  .save("location")

一切都在磁盘上正确。 之后,我想从中创建一个 Hive 表,例如:

CREATE TABLE table USING ORC LOCATION 'location'

命令运行没有任何错误。但是如果我尝试查询该表,它是空的。

我尝试在不分区的情况下做同样的事情,它工作得很好。我究竟做错了什么? 分区文件夹如下所示:LOADED=2019-11-16

供参考:我想将数据写入 Azure Blob 存储,并在不同的集群中从中创建 Hive 表。

【问题讨论】:

    标签: apache-spark pyspark hive partitioning orc


    【解决方案1】:

    您只需要更新表上的分区信息,以便 Hive 可以列出存在的分区。这是通过 MSCK REPAIR 命令完成的:

    spark.sql("MSCK REPAIR TABLE <tableName>")
    

    有关此命令的更多信息here

    此处为快速示例

    scala> spark.sql("select * from table").show
    20/03/28 17:12:46 WARN ObjectStore: Failed to get database global_temp, returning NoSuchObjectException
    +------+------+
    |column|LOADED|
    +------+------+
    +------+------+
    
    scala> spark.sql("MSCK REPAIR TABLE table")
    
    
    scala> spark.sql("select * from table").show
    +------+----------+
    |column|    LOADED|
    +------+----------+
    |     a|2019-11-16|
    |     c|2019-11-16|
    |     b|2019-11-17|
    +------+----------+
    

    【讨论】:

      【解决方案2】:

      您正在将数据直接写入 location,而不是通过 hiveQL 语句,在这种情况下,我们需要使用以下命令从 hive/spark 更新 hive 表的元数据:

      msck repair table <db_name>.<table_name>;
      

      (或)

      alter table <db_name>.<table_name> add partition(`LOADED`='<value>') location '<location_of the specific partition>';
      

      然后运行以下命令列出表中的分区:

      show partitions <db_name>.<table_name>;
      

      【讨论】:

        猜你喜欢
        • 2015-09-13
        • 1970-01-01
        • 2020-09-13
        • 1970-01-01
        • 2018-06-10
        • 2019-01-06
        • 2013-03-15
        • 2022-12-23
        • 1970-01-01
        相关资源
        最近更新 更多