【发布时间】:2020-10-26 06:05:45
【问题描述】:
首先免责声明:我对这两个主题(python 和镶木地板)都很陌生,所以如果我的想法很复杂,请与我交流。
我正在寻找有关如何以最有效的方式最好地完成以下转换的一些指导:
我有一个平面 parquet 文件,其中一个 varchar 列将 JSON 数据存储为字符串,我想将此数据转换为嵌套结构,即 JSON 数据变为嵌套 parquet。如果这有任何帮助,我会提前知道 JSON 的架构。
这是我迄今为止“完成”的事情:
构建样本数据
# load packages
import pandas as pd
import json
import pyarrow as pa
import pyarrow.parquet as pq
# Create dummy data
# dummy data with JSON as string
person_data = {'Name': ['Bob'],
'Age': [25],
'languages': "{'mother_language': 'English', 'other_languages': ['German', 'French']}"
}
# from dict to panda df
person_df = pd.DataFrame.from_dict(person_data)
# from panda df to pyarrow table
person_pat = pa.Table.from_pandas(person_df)
# save as parquet file
pq.write_table(person_pat, 'output/example.parquet')
脚本提案
# load dummy data
sample = pa.parquet.read_table('output/example.parquet')
# transform to dict
sample_dict = sample.to_pydict()
# print with indent for checking
print(json.dumps(sample_dict, sort_keys=True, indent=4))
# load json from string and replace string
sample_dict['languages'] = json.loads(str(sample_dict['languages']))
print(json.dumps(sample_dict, sort_keys=True, indent=4))
#type(sample_dict['languages'])
# how to keep the nested structure when going from dict —> panda df —> pyarrow table?
# save dict as nested parquet...
所以,我这里是我的具体问题:
- 这种方法是可行的方法还是可以以任何方式进行优化? dict、df 和 pa table 之间的所有转换都感觉效率不高,很高兴在这里接受教育。
- 在执行 dict —> df 转换时如何保留嵌套结构?还是根本不需要?
- 编写嵌套 parquet 文件的最佳方法是什么?我已经阅读了Nested data in Parquet with Python,这里提到了快速镶木地板用于阅读,但缺乏写作能力——在此期间是否有任何可行的解决方案?
非常感谢 斯蒂芬
【问题讨论】:
-
你可以使用 PySpark 吗?我认为使用它应该更容易。如果你愿意,我可以使用 PySpark 编写一个解决方案,你可以决定使用它是否是个好主意
-
似乎不支持在您的情况下写入嵌套数据,您检查过issues.apache.org/jira/browse/ARROW-1644 吗?我建议使用 Pyspark
-
嗨@OscarLopezM.,对不起,我出去了一段时间。非常感谢使用 PySpark 的解决方案。已经非常感谢了!
标签: python json parquet pyarrow fastparquet