awswrangler 将镶木地板数据帧写入单个文件
Posted
技术标签:
【中文标题】awswrangler 将镶木地板数据帧写入单个文件【英文标题】:awswrangler write parquet dataframes to a single file 【发布时间】:2021-09-15 02:18:14 【问题描述】:我正在创建一个无法直接放入内存的非常大的文件。所以我在 S3 中创建了一堆小文件,并正在编写一个可以读取这些文件并合并它们的脚本。我正在使用 aws wrangler 来执行此操作
我的代码如下:
try:
dfs = wr.s3.read_parquet(path=input_folder, path_suffix=['.parquet'], chunked=True, use_threads=True)
for df in dfs:
path = wr.s3.to_parquet(df=df, dataset=True, path=target_path, mode="append")
logger.info(path)
except Exception as e:
logger.error(e, exc_info=True)
logger.info(e)
问题是 w4.s3.to_parquet 创建了很多文件,而不是写入一个文件,我也无法删除 chunked=True ,否则我的程序会因 OOM 而失败
如何让它在 s3 中写入单个文件。
【问题讨论】:
嗨@Nirav Nagda 你解决了这个问题吗? 【参考方案1】:AWS Data Wrangler 正在写入多个文件,因为您已指定 dataset=True
。只要您指定完整的path
,删除此标志或切换到False
应该可以解决问题
【讨论】:
这个解决方案有效吗?【参考方案2】:我不相信这是可能的。 @Abdel Jaidi 建议不起作用,因为 append=True
要求数据集为真,否则会引发错误。我相信在这种情况下,append
与通过将新文件添加到同一文件夹中来“附加” Athena 或 Glue 中的数据有关。
我也不认为这对于镶木地板来说是不可能的。根据this SO post,在本地文件夹中是不可能的,更不用说S3了。添加到这个镶木地板是压缩的,我认为在不将其全部加载到 memroy 的情况下将一行添加到压缩文件中并不容易。
我认为唯一的解决方案是获得一个强大的 ec2 实例来处理这个问题。
我面临着类似的问题,我想我将遍历所有小文件并创建更大的文件。例如,您可以将服务器数据帧附加在一起,然后重写它们,但除非您拥有一台具有足够内存的计算机,否则您将无法返回到一个 parquet 文件。
【讨论】:
以上是关于awswrangler 将镶木地板数据帧写入单个文件的主要内容,如果未能解决你的问题,请参考以下文章
将镶木地板从 AWS Kinesis firehose 写入 AWS S3
如何使用 Spark 将镶木地板文件加载到 Hive 表中?
如何将镶木地板文件的 int64 数据类型列转换为 SparkSQL 数据框中的时间戳?