【问题标题】:pyspark: Insert overwrite into a partitioned Table but the whole table is overwritepyspark:将覆盖插入分区表但整个表被覆盖
【发布时间】:2021-11-10 04:31:39
【问题描述】:

我是 Hive 和 spark 的新手,试图将分区表记入其分区列,这是代码:

df.createOrReplaceGlobalTempView(tempTable)
insertSql = "INSERT OVERWRITE TABLE {} PARTITION(dt) SELECT column1, column2, dt FROM {}".format(exportTable, tempTable)
spark.sql(insertSql)

原点导出表:

column1 column2 dt
x1      x2      20210914
x3      x4      20210914
x5      x6      20210914
y1      y2      20210915
y3      y4      20210915

临时表:

column1 column2 dt
x7      x8      20210914
x9      x10     20210914

预期的导出表:

column1 column2 dt
x7      x8      20210914
x9      x10     20210914
y1      y2      20210915
y3      y4      20210915

但是像这样的 exportTable,完全被 tempTable 覆盖了。:

column1 column2 dt
x7      x8      20210914
x9      x10     20210914

我的 spark 版本是 2.2,我必须使用这个版本...

为什么这个 sql 不能工作?有什么问题吗?

【问题讨论】:

  • spark.conf.get("spark.sql.sources.partitionOverwriteMode") 显示什么?
  • 我认为 spark2.2 中没有这个属性
  • issues.apache.org/jira/browse/SPARK-20236覆盖分区数据源表应该只覆盖相关分区

标签: apache-spark pyspark hive


【解决方案1】:

我想覆盖的 Hive 表是通过以下方式创建的:

df.write.saveAsTable()

这个api会创建一个parquet格式的表,执行INSERT OVERWRITE时会被完全覆盖,所以首先将表格式从parquet改为ORC(Hive),然后使用INSERT OVERWRITE;其次是每次都使用以下创建配置单元表:

df.write.format('hive').saveAsTable()

【讨论】:

    猜你喜欢
    • 2017-03-01
    • 1970-01-01
    • 2014-11-27
    • 1970-01-01
    • 1970-01-01
    • 2015-01-10
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    相关资源
    最近更新 更多