有没有办法在写入之前告诉在 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 保存为增量表时将创建多少个文件?的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法告诉 mongod 登录到另一台服务器上的系统日志?
将 Python DataFrame 作为 CSV 写入 Azure Blob