有没有办法在写入之前告诉在 Azure Data Lake Storage Gen1 中将 Spark Dataframe 保存为增量表时将创建多少个文件?

Posted

技术标签:

【中文标题】有没有办法在写入之前告诉在 Azure Data Lake Storage Gen1 中将 Spark Dataframe 保存为增量表时将创建多少个文件?【英文标题】:Is there a way to tell before the write how many files will be created when saving Spark Dataframe as Delta Table in Azure Data Lake Storage Gen1? 【发布时间】:2021-10-14 11:39:52 【问题描述】:

我目前正在尝试将 Spark Dataframe 保存到 Azure Data Lake Storage (ADLS) Gen1。这样做时,我收到以下限制错误:

org.apache.spark.SparkException: Job aborted. Caused by: com.microsoft.azure.datalake.store.ADLException: Error creating file /user/DEGI/CLCPM_DATA/fraud_project/policy_risk_motorcar_with_lookups/part-00000-34d88646-3755-488d-af00-ef2e201240c8-c000.snappy.parquet
Operation CREATE failed with HTTP401 : null
Last encountered exception thrown after 2 tries. [HTTP401(null),HTTP401(null)]

我在documentation 中读到,由于 CREATE 限制而发生限制,然后导致作业中止。该文档还给出了可能发生这种情况的三个原因。

    您的应用程序会创建大量小文件。 外部应用程序会创建大量文件。 订阅的当前限制太低。

虽然我不认为我的订阅太低,但我认为可能是我的应用程序创建了太多 parquet 文件。有谁知道如何判断另存为表格时将创建多少个文件?如何找出允许创建的最大文件数?

我用来创建表格的代码如下:

df.write.format("delta").mode("overwrite").saveAsTable("database_name.df", path ='adl://my path to storage')
 

另外,我能够编写一个较小的测试数据框,没有任何问题。另外,adls 中文件夹的权限设置正确。

【问题讨论】:

【参考方案1】:

您遇到的错误看起来不像文件数量的问题。 401 是未经授权的问题。尽管如此:

Spark 写入的文件数至少与分区数一样多。所以你想要做的是重新分区你的数据框。有几个repartition api,为了减少partition和数据分布,推荐使用coalesce()

df.coalesce(10).write....

你也可以阅读

Spark parquet partitioning : Large number of files Spark dataframe write method writing many small files Spark - repartition() vs coalesce()

【讨论】:

即使在coalesce 之后它仍然失败。我认为发生未经授权的问题是因为写入操作花费的时间太长。显然它是一个已知的issue。我想我将重组我的查询... 我预计:\ 是的.. 无论如何谢谢!

以上是关于有没有办法在写入之前告诉在 Azure Data Lake Storage Gen1 中将 Spark Dataframe 保存为增量表时将创建多少个文件?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在完全加载之前告诉 .ogg 视频的文件大小?

有没有办法告诉 mongod 登录到另一台服务器上的系统日志?

将 Python DataFrame 作为 CSV 写入 Azure Blob

将数据写入 Azure 专用 SQL 池中的特定分区

Azure Data PlatformETL工具——使用Azure Data Factory数据流传输数据

无法从 databricks pyspark 工作人员写入 Azure Sql DataWarehouse