使用pyarrow将JSON写入parquet文件时触发Pandas ValueError如何解决
报错原因
该报错和pyarrow无关,是pandas构造DataFrame时触发的逻辑校验错误。
你通过json.loads(user_json)得到的是单组键值对结构的字典,所有value都是单个字符串标量,pandas的DataFrame.from_dict()方法默认将字典的key作为列名、value作为列值,当所有value都是单个标量时,pandas无法推断行索引,因此要求必须显式传入index参数,否则就会抛出该错误。
解决方法
最简便的修改方案是把加载得到的单条字典包裹到列表中,pandas会自动识别为单条数据,自动生成行索引,无需修改其余逻辑:
将原来的
df = pd.DataFrame.from_dict(json.loads(user_json))
修改为
df = pd.DataFrame.from_dict([json.loads(user_json)])
修改后可正常运行的完整代码
import pyarrow import pyarrow.parquet as pq import pandas as pd import json parquet_schema = pyarrow.schema( [('id', pyarrow.string()), ('firstname', pyarrow.string()), ('lastname', pyarrow.string())]) user_json = '{"id" : "id1", "firstname": "John", "lastname":"Doe"}' writer = pq.ParquetWriter('user.parquet', schema=parquet_schema) df = pd.DataFrame.from_dict([json.loads(user_json)]) table = pyarrow.Table.from_pandas(df) print(table.schema) writer.write_table(table) writer.close()
你也可以选择显式传入index参数实现相同效果,例如:
df = pd.DataFrame.from_dict(json.loads(user_json), index=[0])
内容的提问来源于stack exchange,提问作者danny.lesnik
相关产品推荐
相关产品推荐

