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

Partitioned ORC table shows up empty in Hive

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

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

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

CREATE TABLE table USING ORC LOCATION 'location'

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

我试过在不分区的情况下做同样的事情,而且效果很好。我究竟做错了什么? 分区文件夹如下所示:LOADED=2019-11-16

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

您正在将数据直接写入 location,而不是通过 hiveQL 语句,在这种情况下我们需要从 [更新配置单元 table 的元数据=22=] 使用:

msck repair table <db_name>.<table_name>;

(或)

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

然后 运行 下面的命令从 table 中列出分区:

show partitions <db_name>.<table_name>;

您只需更新 table 上的分区信息,以便 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|
+------+----------+