pyspark - 如何从pyspark中具有json类型字符串的列中提取数据?
问题描述
嗨,我有一个数据框
client_id| event_metadata |
+---------+-----------------------------------------------------
| 18890 |{Scripname:"DELL", Exchange: "NSE", Segment: "EQ" } |
| 10531 |{Scripname:"NAUKRI", Exchange: "NSE", Segment: "EQ" }|
我想提取 event_metadata 并仅将 ScripName 和 client_id 存储为数据框。
event_metadata 是字符串而不是 json。
我努力了
from pyspark.sql import functions as F
df1.select('client_id', F.json_tuple('event_metadata', 'Scripname',
'Exchange','Segment').alias('Scripname',
'Exchange','Segment')).show()
它返回 Null 值
我也尝试过使用正则表达式但显示错误
from pyspark.sql.functions import regexp_extract
df1.withColumn("event_metadata", regexp_extract("event_metadata", "(?
<=Scripname: )\w+(?=(,|}))", 0))\
.show(truncate=False)
期望的输出:
client_id| Scripname|
+--------+-----------
| 18890 | DELL |
| 10531 | NAUKRI |
解决方案
尝试这个-
regexp_extract
df2.withColumn("Scripname",
regexp_extract($"event_metadata", "^\\{\\s*Scripname\\s*:\\s*\"(\\w+)\"", 1)
)
.show(false)
df2.withColumn("Scripname",
expr("""regexp_extract(event_metadata, '^\\{\\s*Scripname\\s*:\\s*"(\\w+)"', 1)""")
)
.show(false)
/**
* +---------+-----------------------------------------------------+---------+
* |client_id|event_metadata |Scripname|
* +---------+-----------------------------------------------------+---------+
* |18890 |{Scripname:"DELL", Exchange: "NSE", Segment: "EQ" } |DELL |
* |10531 |{Scripname:"NAUKRI", Exchange: "NSE", Segment: "EQ" }|NAUKRI |
* +---------+-----------------------------------------------------+---------+
*/
推荐阅读
- json - 使用 3rd 方库 swift 4 提取 JSON 数据
- html - 弹性订单不适用于无序列表
- html - 从 Laravel 日期表单中禁用上一个日期
- c++ - 如果为现有用户提供空白密码,LogonUser() API 将失败
- android - 如何使用 Dagger2 在 ViewModels 中注入依赖项
- ios - 快速在保护语句中显示 ViewController
- angular - 如何在Angular 6应用程序中通过`ng build`指定环境
- header - 如何在其他层之上保留一个固定的标题?
- c - 如何让 getchar() 函数保持退格
- angular - Angular2:在ngOnInit中调用后端api后未填充全局变量