红移谱错误地解析 Pyarrow datetime64[ns]

Redshift spectrum incorrectly parsing Pyarrow datetime64[ns]

我在 Redshift 频谱中有一个外部 table,DDL 的日期时间列如下所示:

collector_tstamp TIMESTAMP WITHOUT TIME ZONE

Objective: 我正在尝试拼花一组特定的数据,然后将分区添加到 Spectrum 中以查看值是否被完美解析。

创建镶木地板后,以下是相应镶木地板文件中 'collector_tstamp' 的元数据:

{"metadata": null, "field_name": "collector_tstamp", "name": "collector_tstamp", "numpy_type": "datetime64[ns]", "pandas_type": "datetime"}

在此之前,我在以下帮助下将 pandas 数据框列转换为日期时间数据类型:

df['collector_tstamp'] = pd.to_datetime(df['collector_tstamp'])

问题:当我在 Redshift spectrum 中查询数据时,我看到以下值,很明显解析是错误的,但我不确定应该更改哪种数据类型以便正确解析:

collector_tstamp
36332-04-23 15:29:01
36332-04-23 15:29:01
36332-04-23 15:29:01
36332-04-23 15:29:01
36332-04-23 15:29:01

我也尝试过类似的方法,但我仍然得到以上值:

df['collector_tstamp'] = pd.to_datetime(df['collector_tstamp'], infer_datetime_format=True)

我也试过这个但是当我查询它时仍然是相同的值:

df['collector_tstamp'] = df['collector_tstamp'].astype('datetime64[s]')

示例数据:

collector_tstamp
2019-01-04 04:02:36
2019-01-04 04:03:41
2019-01-04 04:03:45
2019-01-04 04:04:11

pyarrow 默认写入的纳秒时间戳非常新,当前的 Redshift 版本可能无法正确理解。查看 https://arrow.apache.org/docs/python/parquet.html 上的文档并尝试使用 flavor='spark' 编写文件或阅读 "Storing timestamps" 部分中的其他设置。

由于您可能无法通过pandas.DataFrame.to_parquet正确传递所有参数,您需要使用以下代码编写一个parquet文件:

import pyarrow as pa
import pyarrow.parquet as pq

df = ..some DataFrame..
table = pa.Table.from_pandas(df)
pq.write_table(table, 'filename.parquet')