我使用Dask和PyOrc从ORC文件中的数据库表中写入数据。为了指定正确的dtypes,我使用meta参数read_sql_table
。我的版本是1.2.1
下面是我的代码摘录:
kwargs = dict(
table=fetch_object_name,
index_col=fetch_index_col,
uri=uri,
meta=dask_meta,
columns=list(dask_meta.columns)
)
dask_stream = dd.read_sql_table(**kwargs)
print(dask_stream.dtypes)
dask_stream.map_partitions(
write_to_orc,
data_path,
meta=dask_meta
).compute()
返回
IDX01 Int64
IDX02 Int64
COL01 object
COL02 object
COL03 Int64
COL04 Int64
COL05 Int64
COL06 Int64
COL07 float64
COL08 float64
COL09 float64
COL10 object
COL11 object
COL12 datetime64[ns]
dtype: object
在write_to_orc函数中,我想遍历行以便将它们写入文件,但是当我想打印这些行时,我得到了这个奇怪的行为:
def write_to_orc(df, data_path):
print(df.dtypes)
for row in df.itertuples():
print(row)
我得到了:
IDX01 Int64
IDX02 Int64
COL01 object
COL02 object
COL03 Int64
COL04 Int64
COL05 Int64
COL06 Int64
COL07 float64
COL08 float64
COL09 float64
COL10 object
COL11 object
COL12 datetime64[ns]
dtype: object
Pandas(Index=1, IDX01=1400101, IDX02=447, COL01='Dim ', COL02='1 Dimanche 2040 (Q1)', COL03=98, COL04=-19191, COL05=21082041, COL06=-6071621782820847456, COL07=3131.25, COL08=-1e+121, COL09=4.775582863893604e+18, COL10=datetime.date(1987, 6, 17), COL11=datetime.time(2, 11, 50), COL12=Timestamp('2012-04-27 13:02:23.860000'))
看起来dtypes是好的,但是COL10和COL11列值的类型是错误的。尽管相关的数据类型是object,但Pandas还是以某种方式将它们转换为日期和时间(以及我在任何时候向Pandas提供的日期和时间格式)!
这让我很困扰,因为TIME不是ORC的识别类型,这就是为什么我想作为字符串处理。
你能帮我理解这种奇怪的行为吗?
提前谢谢你
在您的第一个输出中,COL10
和COL11
被报告为object
dtype,这表明它们可能最初在dask_meta
中被转换为datetime
对象(至少对于某些行)。作为一种解决方法,您可以显式地将这些列设置为dask_meta
中的String
(大写版本指的是新的dtype)。