python - 如何在 pandas/spark 数据框中拆分 json 字符串列?
问题描述
我的原始数据框具有以下列-
我想将json_result
列拆分为单独的列,如下所示:
我尝试使用 json_normalise,但无法应用于整个数据帧。有人可以分享代码来转换整个数据框吗?
添加我尝试过的片段 -
raw_data = [{'id': 1, 'name': 'NATALIE', 'json_result': '{"0": {"_source": {"person_id": 101, "firstname": "NATALIE", "lastname": "OSHO", "city_name": "WESTON"}}}'}, \
{'id': 2, 'name': 'MARK', 'json_result': '{"0": {"_source": {"person_id": 102, "firstname": "MARK", "lastname": "BROWN", "city_name": "NEW YORK"}}}'}, \
{'id': 3, 'name': 'NANCY', 'json_result': '{"0": {"_source": {"person_id": 103, "firstname": "NANCY", "lastname": "GATES", "city_name": "LA"}}}'}]
df = pd.DataFrame.from_dict(raw_data)
splitted_df = pd.json_normalize(df['json_result'][0])
错误信息:
AttributeError:“str”对象没有属性“values”
解决方案
将 json 转换为列的 Spark 版本。
raw_data = \
[{'id': 1, 'name': 'NATALIE', 'json_result': '{"0": {"_source": {"person_id": 101, "firstname": "NATALIE", "lastname": "OSHO", "city_name": "WESTON"}}}'}, \
{'id': 2, 'name': 'MARK', 'json_result': '{"0": {"_source": {"person_id": 102, "firstname": "MARK", "lastname": "BROWN", "city_name": "NEW YORK"}}}'}, \
{'id': 3, 'name': 'NANCY', 'json_result': '{"0": {"_source": {"person_id": 103, "firstname": "NANCY", "lastname": "GATES", "city_name": "LA"}}}'}]
df = spark.createDataFrame(raw_data)
json_schema = spark.read.json(df.rdd.map(lambda rec: rec.json_result)).schema
df = df.withColumn('json', F.from_json(F.col('json_result'), json_schema)) \
.select("id", "name", "json.0._source.*")
df.show()
推荐阅读
- php - 使用ajax在codeigniter中上传文件
- angular - Angular6 捕获超时错误
- javascript - If 语句中的 HTML/Javascript && 条件
- angular - 在 ngFor 中访问本地 #variable
- java - java - 当Java变量以前导零开头时如何将其保留为字符串
- vba - VBA 在其他 VBA 复制数据之后粘贴数据
- apache-spark - 在 Spark Structured Streaming 中反序列化自引用 protobuf
- c# - c# 中带有保留字的 SQL 更新语句
- javascript - 在空的搜索/文本框中按回车键时,我怎样才能不发生任何事情
- javascript - 如何防止添加arraylist的重复对象值?