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

时间:2019-03-22 13:06:05

标签: python pandas dask parquet

这是与此post相关的问题。

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

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

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不接受该关键字。在documentation中,似乎暗示categories接任了这个角色,但是即使通过categories=dtypes,我仍然会遇到相同的错误。

如何在dask.dataframe.read_parquet中传递类型说明?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

似乎问题在于镶木地板引擎。当我将代码更改为

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

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

编写和加载工作正常。