红移谱错误地解析 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')
我在 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')