当前位置: 首页 > 知识库问答 >
问题:

覆盖spark数据帧写入方法中的特定分区

季博
2023-03-14

我想覆盖特定的分区,而不是spark中的所有分区。我正在尝试以下命令:

df.write.orc('maprfs:///hdfs-base-path','overwrite',partitionBy='col4')

其中df是具有要覆盖的增量数据的数据帧。

hdfs基本路径包含主数据。

当我尝试上述命令时,它会删除所有分区,并将df中存在的分区插入hdfs路径。

我的要求是只覆盖df中指定hdfs路径上的那些分区。有人能帮我一下吗?

共有3个答案

哈雅珺
2023-03-14
spark.conf.set("spark.sql.sources.partitionOverwriteMode","dynamic")
data.toDF().write.mode("overwrite").format("parquet").partitionBy("date", "name").save("s3://path/to/somewhere")

这适用于AWS Glue ETL作业(Glue 1.0-Spark 2.4-Python 2)

明正德
2023-03-14

这是一个常见的问题。Spark高达2.0的唯一解决方案是直接写入分区目录,例如。,

df.write.mode(SaveMode.Overwrite).save("/root/path/to/data/partition_col=value")

如果您使用的是Spark 2.0之前的版本,则需要使用以下方法阻止Spark发出元数据文件(因为它们会破坏自动分区发现):

sc.hadoopConfiguration.set("parquet.enable.summary-metadata", "false")

如果您使用的是1.6.2之前的Spark,还需要删除根/路径/到/数据/分区列=值中的成功文件,否则它的存在将中断自动分区发现。(我强烈建议使用1.6.2或更高版本。)

您可以从我关于防弹作业的Spark峰会演讲中获得有关如何管理大型分区表的更多详细信息。

江阳羽
2023-03-14

终于!这现在是Spark 2.3.0: SPARK-20236中的一项功能

要使用它,需要设置火花。sql。来源。partitionOverwriteMode设置为动态,数据集需要分区,写入模式覆盖。例子:

spark.conf.set("spark.sql.sources.partitionOverwriteMode","dynamic")
data.write.mode("overwrite").insertInto("partitioned_table")

我建议在编写之前根据您的分区列进行重新分区,这样您就不会在每个文件夹中有400个文件。

在Spark 2.3.0之前,最好的解决方案是启动SQL语句删除这些分区,然后使用模式append编写它们。

 类似资料:
  • 在我的工作中,最后一步是将执行的数据存储在配置单元表中,分区位于“date”列。有时,由于作业失败,我需要单独为特定的分区重新运行作业。正如所观察到的,当我使用下面的代码时,spark会在使用覆盖模式时覆盖所有分区。 在浏览了多个博客和stackoverflow之后,我按照以下步骤只覆盖特定的分区。 根据本博客https://www.waitingforcode.com/apache-spark-

  • 有人能解释一下将为Spark Dataframe创建的分区数量吗。 我知道对于RDD,在创建它时,我们可以提到如下分区的数量。 但是对于创建时的Spark数据帧,看起来我们没有像RDD那样指定分区数量的选项。 我认为唯一的可能性是,在创建数据帧后,我们可以使用重新分区API。 有人能告诉我在创建数据帧时,我们是否可以指定分区的数量。

  • 我正在编写一个脚本,将带有标头的大. xlsx文件减少到CSV中,然后根据标头名称编写一个新的CSV文件,其中仅包含所需的列。 我得到的错误是最后一段代码,它说 我肯定我忽略了一些愚蠢的东西,但是我已经阅读了熊猫网站上的留档,我仍然不知所措。我知道我误用了to_csv参数,但我似乎无法理解留档。 任何帮助都是赞赏的,谢谢!

  • 我正在尝试使用pysparkn和spack-csv使用以下代码将火花数据帧写入s3 但是,我得到的错误是“输出目录已经存在”,我确信输出目录在作业开始之前不存在,我尝试使用不同的输出目录名称运行,但写入仍然失败。 如果我在作业失败后查看s3桶,我发现很少有零件文件是由火花写入的,但当它尝试写入更多时它失败了,脚本在本地运行良好,我在aws集群上使用10个火花执行器。有人知道这段代码有什么问题吗?

  • 在scala火花数据帧中是否有的替代方案。我想从火花数据帧的列中选择特定的行。例如,在R等效代码中的第100行

  • null 非常感谢任何指向文档或非常基本的示例的指针。