繁体   English   中英

Dask Parquet使用数据模式加载文件

[英]Dask Parquet loading files with data schema

这是与此帖子有关的问题。

我正在尝试使用Dask和Parquet文件。 我加载了我在此处下载的纽约违章停车数据。

我读取了数据文件,找到了常见的列,应用了数据类型,然后将所有内容另存为实木复合地板。

from dask import dataframe as dd
from dask.diagnostics import ProgressBar
import numpy as np

base_url = 'origin/nyc-parking-tickets/'

fy14 = dd.read_csv(base_url + '*2014_.csv')
fy15 = dd.read_csv(base_url + '*2015.csv')
fy16 = dd.read_csv(base_url + '*2016.csv')
fy17 = dd.read_csv(base_url + '*2017.csv')

data = [fy14, fy15, fy16, fy17]
col_set = [set(d.columns) for d in data]
common_columns = list(set.intersection(*col_set))

# Set proper column types
dtype_tuples = [(x, np.str) for x in common_columns]
dtypes = dict(dtype_tuples)

floats = ['Feet From Curb', 'Issuer Code', 'Issuer Precinct', 'Law Section', 'Vehicle Year', 'Violation Precinct']
ints32 = ['Street Code1', 'Street Code2', 'Street Code3', 'Summons Number']
ints16 = ['Violation Code']

for item in floats: dtypes[item] = np.float32
for item in ints32: dtypes[item] = np.int32
for item in ints16: dtypes[item] = np.int16

# Read Data
data = dd.read_csv(base_url + '*.csv', dtype=dtypes, usecols=common_columns) # usecols not in Dask documentation, but from pandas

# Write data as parquet
target_url = 'target/nyc-parking-tickets-pq/'
with ProgressBar():
    data.to_parquet(target_url)

当我尝试重新加载数据时

data2 = dd.read_parquet(target_url, engine='pyarrow')

我收到ValueError,即某些分区具有不同的文件格式。 查看输出,可以看到“ Violation Legal Code”列在一个分区中被解释为空,这可能是因为数据太稀疏而无法采样。

在原始问题的帖子中,提出了两种解决方案。 第一个是关于输入哑数值,另一个是在加载数据时提供列类型。 我想做后者,我被困住了。 dd.read_csv方法我可以传递dtype参数,为此,我刚进入dtypes以上定义的字典。 dd.read_parquet不接受该关键字。 文档中 ,似乎暗示categories正在接管该角色,但是即使传递categories=dtypes ,我仍然会遇到相同的错误。

如何在dask.dataframe.read_parquet传递类型规范?

您不能将dtypes传递给read_parquet,因为Parquet文件知道它们自己的dtypes(在CSV中是不明确的)。 Dask DataFrame期望数据集的所有文件都具有相同的架构,截至2019-03-26,不支持加载混合架构的数据。

话虽这么说,您可以使用“延迟延迟”之类的方法自己进行操作,在逐个文件的基础上进行所需的任何操作,然后将其转换为带有dd.from_delayed的延迟数据dd.from_delayed 有关此的更多信息,请参见此处。

看来问题出在镶木地板引擎上。 当我将代码更改为

data.to_parquet(target_url, engine = 'fastparquet')

data.from_parquet(target_url, engine = 'fastparquet')

编写和加载工作正常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM