【问题标题】:Unable to write dataframe into Hive partitioned parquet table using pyspark无法使用 pyspark 将数据帧写入 Hive 分区镶木地板表
【发布时间】:2019-10-13 05:06:00
【问题描述】:

我正在尝试将我的数据框写入分区配置单元表。配置单元表格式是镶木地板。

但我无法将 df 写入 Hive 表。

我正在尝试将我的数据框写入分区配置单元表。配置单元表格式是镶木地板。

但我无法将 df 写入 Hive 表。

Spark2.3 和分区 hive 表

当我尝试将 finaldf 加载到 hive 分区表中时,出现以下错误

finaldf.write.mode("overwrite").format("parquet").partitionBy("mis_dt","country_codfe").saveAsTable("FinalTable")

错误:u'Cannot overwrite table schema.Offertablethat is also being read from;'

当我搜索上述错误时,他们建议将 df 加载到临时表中并加载到最终的配置单元表中。我尝试了该选项,但再次失败并出现不同的错误。

finaldf.createOrReplaceTempView('tmpTable') 
final= spark.read.table('tmpTable') 
final.write.mode("overwrite").insertInto("Finaltable")

错误:创建的分区数为 7004,大于 1000。

但我不认为我们有那么多分区。

finaldf.write.mode("overwrite").format("parquet").partitionBy("mis_dt","country_codfe").saveAsTable("FinalTable")

第二个选项:

finaldf.createOrReplaceTempView('tmpTable')
final= spark.read.table('tmpTable') 
final.write.mode("overwrite").insertInto("Finaltable")

我希望使用 spark 2.3 将数据写入 hive parquet 文件格式表

finaldf.write.mode("overwrite").format("parquet").partitionBy("mis_dt","cntry_cde").saveAsTable("finaltable")

【问题讨论】:

    标签: apache-spark-sql pyspark-sql parquet


    【解决方案1】:

    spark.sql.sources.partitionOverwriteMode 在 Spark >= 2.3 中引入

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

    使用下面的代码 -

    final.write.mode(SaveMode.Overwrite).insertInto("table")
    

    注意:表应该在 Hive 中创建,并带有分区。

    【讨论】:

    • 谢谢。 @ 987654321@ 但最后我收到以下错误,如下所示超过 1000。要解决此问题,请尝试将 hive.exec.max.dhttps://stackoverflow.com/users/3715328/kishoreynamic.partitions 设置为至少 7004。;
    • 你不能在 spark 中设置分区号。 issues.apache.org/jira/browse/SPARK-19881
    猜你喜欢
    • 1970-01-01
    • 2016-09-03
    • 2020-06-30
    • 2020-04-30
    • 1970-01-01
    • 2021-03-26
    • 1970-01-01
    • 2020-11-07
    • 2021-03-15
    相关资源
    最近更新 更多