使用 pyspark 插入镶木地板文件时,Hive 表需要对每个新分区进行“修复”

Posted

技术标签:

【中文标题】使用 pyspark 插入镶木地板文件时,Hive 表需要对每个新分区进行“修复”【英文标题】:Hive table requires 'repair' for every new partitions while inserting parquet files using pyspark 【发布时间】:2021-10-19 14:13:59 【问题描述】:

我的 spark conf 为:

sparkConf.set("spark.sql.sources.partitionOverwriteMode", "dynamic")    
sparkConf.set("hive.exec.dynamic.partition", "true")
sparkConf.set("hive.exec.dynamic.partition.mode", "nonstrict")

我正在使用 spark 上下文将 parquet 文件写入 hdfs 位置:

df.write.partitionBy('asofdate').mode('append').parquet('parquet_path')

在 hdfs 位置,镶木地板文件存储为“asofdate”,但在 hive 表中,我必须每天执行“MSCK REPAIR TABLE ”。我正在寻找一个解决方案,说明如何使用 spark 脚本(或在创建分区时)为每个新分区执行 recover table

【问题讨论】:

【参考方案1】:

最好是integrate hive with spark 让你的工作更轻松。

在 hive-spark 集成设置后,您可以在创建 SparkSession 时启用 hive 支持。

  spark = SparkSession.builder.enableHiveSupport().getOrCreate()

现在您可以从 spark 访问 hive 表。 您可以从 spark 本身运行修复命令。

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

我建议直接将数据帧写为蜂巢表,而不是将其写入镶木地板并进行修复表。

df.write.partitionBy("<partition_column>").mode("append").format("parquet").saveAsTable("<table>")

【讨论】:

我的流媒体服务每 1 小时生成 100> 个 parquet 文件。因此,每小时运行修复表可能会产生开销。而且我还需要将镶木地板文件保存到 hdfs 位置。

以上是关于使用 pyspark 插入镶木地板文件时,Hive 表需要对每个新分区进行“修复”的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Spark 将镶木地板文件加载到 Hive 表中?

使用 Pyspark 在 s3 中写入镶木地板文件时出错

从目录读取镶木地板文件时,pyspark不保存

使用 pyspark 从 s3 位置读取镶木地板文件的文件夹到 pyspark 数据帧

在 PySpark 中写入镶木地板的问题

如何使用 Pyspark 并行处理多个镶木地板文件?