使用Scala数据框中的分区创建配置单元表

问题描述

我需要一种从Scala数据帧创建配置单元表的方法。蜂巢表应具有按日期划分的S3位置的ORC格式的基础文件

这是到目前为止我得到的:

我将ORA格式的scala数据帧写入S3

df.write.format("orc").partitionBy("date").save("S3Location)

我可以在S3位置看到ORC文件。 我现在在这些ORC文件的顶部创建一个配置单元表:

CREATE EXTERNAL TABLE "tableName"(columnName string)
PARTITIONED BY (date string)
STORED AS ORC
LOCATION "S3Location"
TBLPROPERTIES("orc.compress"="SNAPPY")

但是配置单元表为空,即 spark.sql("select * from db.tableName")不显示任何结果。

但是,当我删除PARTITIONED BY行时:

CREATE EXTERNAL TABLE "tableName"(columnName string,date string)
STORED AS ORC
LOCATION "S3Location"
TBLPROPERTIES("orc.compress"="SNAPPY")

我看到了选择查询的结果。

蜂巢似乎无法识别spark创建的分区。我正在使用Spark 2.2.0。

任何建议将不胜感激。

更新

我从spark数据帧开始,我只需要一种在其顶部创建配置单元表的方式(底层文件在S3位置为ORC格式)。

解决方法

我认为尚未将分区添加到配置单元metastore中,因此您只需要运行以下配置单元命令即可:

MSCK REPAIR TABLE table_name

如果不起作用,可能是您需要检查以下几点:

  • 将数据写入s3后,文件夹应类似于:s3://anypathyouwant/mytablefolder/transaction_date=2020-10-30
  • 创建外部表时,位置应指向s3://anypathyouwant/mytablefolder

是的,Spark将数据写入s3,但没有将分区定义添加到配置单元metastore中!而且,除非它们在可识别的分区下,否则它们不会知道写入的数据。 因此,要检查配置单元metastore中的分区,可以使用以下配置单元命令:

SHOW PARTITIONS tablename

在生产环境中,出于此目的,我不建议使用MSCK REPAIR TABLE,因为这样做会浪费大量时间。最好的方法是使代码通过rest api仅将新创建的分区添加到元存储中。