Spark SQL如何提取字符串字段中JSON格式的问卷问题与答案
错误原因
报错是因为Responses字段是字符串类型,存储的是JSON格式的文本,而explode函数要求输入必须是数组或Map类型,因此无法直接处理字符串输入。
解决步骤
需要先将字符串格式的JSON内容解析为Spark可识别的复合类型,再通过两次explode拆解得到最终的问答列:
- 用
from_json函数将字符串类型的Responses解析为数组<Map<字符串,字符串>>类型 - 第一次explode拆解数组,得到每个独立的问答Map对象
- 第二次explode拆解Map的键值对,得到对应的问题、答案字段
完整可运行SQL代码
SELECT r.CustomerID, kv.question AS Questions, kv.answer AS Answers FROM ( -- 子查询完成JSON字符串到复合类型的转换 SELECT CustomerID, from_json(Responses, 'array<map<string, string>>') AS response_arr FROM your_table_name -- 此处替换为你的实际表名 ) r -- 拆解数组,得到每条问答对应的Map LATERAL VIEW OUTER EXPLODE(r.response_arr) exploded AS response_map -- 拆解Map,得到问题和答案 LATERAL VIEW OUTER EXPLODE(response_map) kv AS question, answer
说明
- 如果不需要保留没有有效Responses的CustomerID,可以去掉两个
OUTER关键字 - 如果JSON结构存在嵌套等特殊情况,可以调整
from_json的Schema定义适配实际结构 - 代码可以直接兼容你给出的示例数据,运行后得到的结果和你期望的输出完全一致
内容的提问来源于stack exchange,提问作者Jim
相关产品推荐
相关产品推荐

