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 数据框中的时间戳?

如何将镶木地板格式的特定列加载到 Redshift 光谱中?

将镶木地板文件加载到红移时如何格式化时间戳字段?