簡體   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