С помощью Dask я пытаюсь создать столбец со списком типов с целыми числами. Например:
import dask.dataframe as dd
import pandas as pd
# Have an example Dask Dataframe
ddf = dd.from_pandas(pd.DataFrame({
'id': [1, 2, 3, 4, 5],
'name': ['Alice', 'Bob', 'Charlie', 'David', 'Emma'],
'age': [25, 30, 35, 40, 45]
}), npartitions=1)
# now create an array type column
ddf["alist"] = ddf.apply(
lambda k: [1, 0, 0], axis=1, meta=("alist", "list<item: int64>")
)
Этот конкретный случай терпит неудачу, потому что:
TypeError: тип данных «list<item: int64>» не понятен
В конце концов я хочу написать на паркет:
ddf.to_parquet(
"example",
engine = "pyarrow",
compression = "snappy",
overwrite=True,
)
и если я укажу неверный тип dtype, это вызовет:
ValueError: Failed to convert partition to expected pyarrow schema:
`ArrowInvalid('Could not convert [1, 2, 3] with type list: tried to convert to int64', 'Conversion failed for column alist with type object')`
Expected partition schema:
id: int64
name: large_string
age: int64
alist: int64
__null_dask_index__: int64
Received partition schema:
id: int64
name: large_string
age: int64
alist: list<item: int64>
child 0, item: int64
__null_dask_index__: int64
This error *may* be resolved by passing in schema information for
the mismatched column(s) using the `schema` keyword in `to_parquet`.
Поскольку у меня также возникла проблема с непосредственным созданием и определением столбца списка в фрейме данных dask и возникла та же проблема, я выбрал альтернативный подход, который включает сериализацию списка в строку json для хранения.
Вот мое предложение
import dask.dataframe as dd
import pandas as pd
import json
pdf = pd.DataFrame({
'id': [1, 2, 3, 4, 5],
'name': ['Alice', 'Bob', 'Charlie', 'David', 'Emma'],
'age': [25, 30, 35, 40, 45],
'alist': [[1, 0, 0] for _ in range(5)]
})
pdf['alist'] = pdf['alist'].apply(json.dumps)
ddf = dd.from_pandas(pdf, npartitions=1)
import pyarrow as pa
schema = pa.schema([
('id', pa.int64()),
('name', pa.string()),
('age', pa.int64()),
('alist', pa.string()),
])
ddf.to_parquet(
"example",
engine = "pyarrow",
compression = "snappy",
overwrite=True,
schema=schema
)
Как обсуждалось здесь, вы также можете указать типы PyArrow при написании:
ddf.to_parquet(
"example",
engine = "pyarrow",
compression = "snappy",
overwrite=True,
schema = {
"alist": pa.list_(pa.int32()),
}
)
Я вижу, что это еще одна проблема: stackoverflow.com/questions/47113813/… поэтому я принял ответ
Это работает только в режиме
overwrite=True
. Когда я пытаюсь добавить существующую таблицу:ValueError: Appended dtypes differ. {('id', dtype('int64')), ('age', 'int64'), ('__null_dask_index__', dtype('int64')), ('alist', 'object'), ('id', 'int64'), ('name', string[pyarrow]), ('name', 'string'), ('alist', string[pyarrow]), ('age', dtype('int64')), ('__null_dask_index__', 'int64')}