当使用 dask 读取包含复杂字段的 JSON 行文件时,我无法获取正确的数据类型。
JSON 行文件如下所示
{"col1": "some text", "col2": ["a", "b", "c"]}
我将
dataframe.convert-string
设置为 False
以使 dask 将第二列读取为字符串列表(请参阅此评论)。但是,这为我提供了两列的数据类型 object
。如果我提供显式数据类型(如上面链接中的建议),它将失败并出现元数据不匹配错误。如何将数据类型正确设置为字符串(对于字符串)和对象(对于复杂列)?或者两列都是对象类型可以吗?
import dask.dataframe as dd
from dask import config
df = dd.read_json('df.jsonl', orient='records', lines=True)
df.dtypes
# col1 string[pyarrow]
# col2 string[pyarrow] ## WRONG!
# dtype: object
config.set({'dataframe.convert-string': False})
df = dd.read_json('df.jsonl', orient='records', lines=True)
df.dtypes
# col1 object
# col2 object
# dtype: object
df = dd.read_json('df.jsonl', orient='records', lines=True,
metadata={'col1': 'string[pyarrow]',
'col2': 'object'})
df.dtypes
# col1 string[pyarrow]
# col2 object
# dtype: object
df.head()
# ValueError: Metadata mismatch found in `from_delayed`.
如果您的列可以包含列表或字典等数据结构,那么使用对象数据类型是合适的。如果这导致问题,请在加载数据后将列转换为所需的数据类型。
此外,您在读取 DataFrame 后将 dataframe.convert-string 设置为 False,但为时已晚。您应该在读取 JSON 文件之前设置此配置。