这是与此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
中传递类型说明?
答案 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')
编写和加载工作正常。