python - 提高在 parquet 文件中重写时间戳的性能
问题描述
由于我的数据使用者的一些限制,我需要“重写”一些 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,因为我的数据集中有无符号整数。
解决方案
您可以尝试一次重写所有列。也许这会减少熊猫中的一些内存副本,从而在您有很多列的情况下加快进程:
df_datetimes = df.select_dtypes(include="datetime64[ns]")
df[df_datetimes.columns] = df_datetimes.astype("datetime64[ms]")
推荐阅读
- python - 在odoo13中发送电子邮件时,应将所选的pdf报告附在报价单中
- java - 在 Java Map 中查找重复值和相同值的出现次数
- javascript - 函数返回 x 次,由参数指定?
- windows - IIS 不会运行 bat 文件(UAC 虚拟化问题)
- pytorch - 理解变换:调整大小并以相同大小居中裁剪
- python - 线程完成后启动线程
- reactjs - 将 useState(undefined) 用于布尔状态而不是 useState(false\true) 认为可以吗?
- core-data - 无法将 ForEach 用于来自 coredata 的不同记录
- python - Binance api 保证金错误:'code': 200003900 'msg': ... 试图从受限司法管辖区访问我们的服务
- c# - C#调用接口方法在许多类中实现,而没有这些类的实例