当在pyarrow.dataset中使用扫描仪将一个大的csv文件转换为parquet文件时,如何更改列类型?

klr1opcd  于 2023-03-05  发布在  其他
关注(0)|答案(1)|浏览(80)

我正在尝试将一个.csv文件转换为parquet格式。它太大了,内存中放不下,所以我使用了pyarrow.dataset()。当使用扫描仪时,我可以很好地工作,如下所示:

import pyarrow.dataset as ds
import pyarrow as pa
source = "foo.csv"
dest = "Data/parquet"

dt = ds.dataset(source, format="csv")
part = ds.partitioning(pa.schema([("date", pa.date32())]), flavor="hive")
ds.write_dataset(scanner, dest, format="parquet", partitioning=part)

我的问题是.csv文件有一列“time”,其值如下:
世界协调时2022年1月3日14:30:00.000652
当使用上面的方法时,列最终变成了字符串。我可以在读入它时使用panda的to_datetime()转换它,但它有很多记录,所以每当我读取数据时都会花费大量的时间。所以,我希望将该列存储为时间戳。
我试图将一个模式传递给ds.write_dataset(),但它返回了一个错误:
ValueError:写入扫描器时无法指定架构
我尝试将模式传递给ds.dataset(),该列的类型为pa.timestamp("ns")pa.date64()pa.date32()pa.time64("ns"),但是该列中的值出现CSV转换错误。
如何让pyarrow.dataset正确解析这些值并将其保存为时间戳?

nwlls2ji

nwlls2ji1#

ds.dataset接受模式作为可选输入。

In []: schema = pa.schema({"date": pa.date32(), "time": pa.time32("s")})

In []: dt = ds.dataset(source, format='csv', schema=schema)

In []: dt.schema
Out[]: 
date: date32[day]
time: time32[s]

相关问题