如何解决从 pyarrow.Table 转换为 pandas
我有一个 9999-12-31 23:59:59
的时间戳作为 int96 存储在镶木地板文件中。我使用 pyarrow.dataset 读取了这个镶木地板文件,并将结果表转换为 Pandas 数据框(使用 pyarrow.Table.to_pandas())。转换为 Pandas 数据帧将我的时间戳转换为 1816-03-30 05:56:07.066277376
(Pandas 时间戳的有效日期范围可能较小),而没有任何关于数据类型或任何内容的抱怨。
然后我将这个 Pandas 数据帧转换回表格并使用 pyarrow.dataset.write_dataset 将其写入镶木地板数据集
我现在得到的数据与开始时的数据不同,没有看到任何警告。 (当我尝试从 parquet 数据集创建一个 impala 表然后无法正确查询它时,我发现了这一点)。
在从 pyarrow 表转换为 Pandas 时,有没有办法处理这些大的时间戳?
我已尝试使用 timestamp_as_object = True
中的 Table.to_pandas(timestamp_as_object = True)
参数,但似乎没有任何作用。
EDIT:提供可重现的示例。问题是 pyarrow 在读取文件时认为时间戳是纳秒,尽管它们被存储为微秒:
import pyarrow as pa
import pyarrow.dataset as ds
non_legacy_hdfs_filesystem = # connect to a filesystem here
my_table = pa.Table.from_arrays([pa.array(['9999-12-31','9999-12-31','9999-12-31']).cast('timestamp[us]')],names = ['my_timestamps'])
parquet_format = ds.ParquetFileFormat()
write_options = parquet_format.make_write_options(use_deprecated_int96_timestamps = True,coerce_timestamps = 'us',allow_truncated_timestamps = True)
ds.write_dataset(data = my_table,base_dir = 'my_path',filesystem = non_legacy_hdfs_filesystem,format = parquet_format,file_options = write_options,partitioning= None)
dataset = ds.dataset('my_path',filesystem = non_legacy_hdfs_filesystem)
dataset.to_table().column('my_timestamps')
解决方法
我的理解是您的数据是使用 use_deprecated_int96_timestamps=True
保存的。
import pyarrow as pa
import pyarrow.parquet as pq
my_table = pa.Table.from_arrays([pa.array(['9999-12-31','9999-12-31','9999-12-31']).cast('timestamp[us]')],names = ['my_timestamps'])
pq.write_table(my_table,'/tmp/table.pq',use_deprecated_int96_timestamps=True)
在此模式下,时间戳使用具有(默认/硬编码)纳秒分辨率的 96 位整数保存。
>>> pq.read_metadata('/tmp/table.pq').schema[0]
<ParquetColumnSchema>
name: my_timestamps
path: my_timestamps
max_definition_level: 1
max_repetition_level: 0
physical_type: INT96
logical_type: None
converted_type (legacy): NONE
在最新版本的 arrow/parquet 中,时间戳是具有可配置分辨率的 64 位整数。
应该可以使用微秒分辨率将传统的 96 位纳秒时间戳转换为 64 位整数而不会丢失信息。但不幸的是,parquet reader 中没有选项可以让您这样做(据我所知)。
您可能不得不提出镶木地板/箭头的问题,但我认为他们正在努力弃用 96 位整数enter link description here。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。