分区的ORC表在Hive中显示为空

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分区的ORC表在Hive中显示为空相关的知识,希望对你有一定的参考价值。

我已经将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表。

答案

您只需要更新表上的分区信息,以便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|
+------+----------+
另一答案

您不是通过hiveQL语句将数据直接写入location,在这种情况下,我们需要使用以下命令从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>;

以上是关于分区的ORC表在Hive中显示为空的主要内容,如果未能解决你的问题,请参考以下文章

带有日期分区的 HdInsight Azure DW Polybase 到 Hive 表 (ORC) 失败

如何加载分区到 Hbase 表的 hive orc

通过 Spark 加载的表在 Hive 中无法访问

Spark 结构化流写入流到 Hive ORC 分区外部表

统计hive库表在具体下所有分区大小

无法在hive分区表中查看数据