【问题标题】:Improve performance of rewriting timestamps in parquet files提高在 parquet 文件中重写时间戳的性能
【发布时间】:2019-10-19 13:20:31
【问题描述】:

由于我的数据消费者的一些限制,我需要“重写”一些 parquet 文件以将纳秒精度的时间戳转换为毫秒精度的时间戳。

我已经实现了它并且它有效,但我对它并不完全满意。

import pandas as pd

        df = pd.read_parquet(
            f's3://{bucket}/{key}', engine='pyarrow')

        for col_name in df.columns:
            if df[col_name].dtype == 'datetime64[ns]':
                df[col_name] = df[col_name].values.astype('datetime64[ms]')

        df.to_parquet(f's3://{outputBucket}/{outputPrefix}{additionalSuffix}',
                      engine='pyarrow', index=False)

我目前正在为每个文件在 lambda 中运行此作业,但我可以看到这可能很昂贵,并且如果作业花费的时间超过 15 分钟,则可能并不总是有效,因为这是 Lambda 可以运行的最长时间。

文件可以较大 (>500 MB)。

我可以考虑任何想法或其他方法吗?我无法使用 pyspark,因为我的数据集中有无符号整数。

【问题讨论】:

    标签: python pandas amazon-s3 parquet pyarrow


    【解决方案1】:

    首次写入文件时将use_deprecated_int96_timestamps=True添加到df.to_parquet(),它将保存为纳秒时间戳。 https://arrow.apache.org/docs/python/generated/pyarrow.parquet.ParquetWriter.html

    【讨论】:

    • 我想保存在 ms,而不是 ns
    【解决方案2】:

    您可以尝试一次重写所有列。也许这会减少 pandas 中的一些内存副本,从而在您有很多列时加快进程:

    df_datetimes = df.select_dtypes(include="datetime64[ns]")
    df[df_datetimes.columns] = df_datetimes.astype("datetime64[ms]")
    

    【讨论】:

      猜你喜欢
      • 2018-11-15
      • 2019-06-10
      • 1970-01-01
      • 2017-03-27
      • 2018-02-04
      • 2019-12-13
      • 1970-01-01
      • 2022-10-07
      • 2021-05-02
      相关资源
      最近更新 更多