改善实木复合地板文件中重写时间戳的性能

时间:2019-06-04 02:27:56

标签: python pandas amazon-s3 parquet pyarrow

由于我的数据使用方的某些限制,我需要“重写”一些镶木地板文件,以将纳秒精度的时间戳转换为毫秒精度的时间戳。

我已经实现了它并且可以使用,但是我并不完全满意。

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,因为我的数据集中有无符号整数。

2 个答案:

答案 0 :(得分:0)

您可以尝试一次重写所有列。也许这会减少熊猫的一些内存副本,从而在您有许多列的情况下加快了处理速度:

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

答案 1 :(得分:0)

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