SparkSql 解析 string json格式

本文探讨了处理复杂JSON格式数据的方法,包括使用`json_tuple`和`get_json_object`函数在Spark SQL中解析JSON数据。`json_tuple`允许一次性获取多个键值并重命名,但不支持类型转换,而`get_json_object`可以深入解析多层嵌套的键值,但不能一次获取多个。对于包含数组的复合JSON字符串,文章介绍了通过正则表达式和`explode`函数进行解析的步骤。这些技术在大数据处理中对于提取和分析信息至关重要。
1,普通string类型json 格式根据key 返回 value 处理:
  json_tuple(字段名,'k1','k2','等等') as (v1,v2,等等)
       优点:同时获取一个json 数据中多个key value 值很方便,且能直接重命名; 如果key 不存在直接返回null 值
       缺点:返回值默认string,获取value 值时不能直接进行类型转换;同一个sql 中只能使用一次 json_tuple 对json 格式数据直接处理;
  
    实例:
    spark.sql("select content,json_tuple(content,'content','title') as(newName1,newName2) from XXXXXXX").show()
    +---------------------------------------------------------------+----------------+--------+
    |content                                                        |newName1        |newName2|
    +---------------------------------------------------------------+----------------+--------+
    |{"content":"\u8c22\u8c22"}                                     |谢谢            |null    |
    |{"content":"\u6b63\u786e\u7b54\u68483"}                        |正确答案3       |null    |
    |{"content":"\u591a\u9009\u9898"}                               |多选题          |null    |
   get_json_object(待解析string,'$.k')
   优点:一次只能完全解析出一个key 对应的value 值,但是同一个sql 中能多次使用 get_json_object 根据key 获取value 值;
        支持多层嵌套解析
        缺点:不能像json_tuple一样 一次解析多个key 对应value 值
   
   spark.sql("select content,get_json_object(content,'$.content'),get_json_object(content,'$.title') from XXXX").show()
    +---------------------------------------------------------------+-----------------------------------+---------------------------------+
    |content                                                        |get_json_object(content, $.content)|get_json_object(content, $.title)|
    +---------------------------------------------------------------+-----------------------------------+---------------------------------+
    |{"content":"\u8c22\u8c22"}                                     |谢谢                               |null                             |
    |{"content":"\u6b63\u786e\u7b54\u68483"}                        |正确答案3                          |null                             |
    |{"content":"\u591a\u9009\u9898"}                               |多选题                             |null                             |
    |{"content":"\u3010\u672a\u77e5\u6d88\u606f\u7c7b\u578b\u3011"} |【未知消息类型】                   |null                             |
   get 多层值:
       含义:解析 buyerinfo string 中key 为 buyerExpandInfoVo 其value值中 key 是attributionStoreId 对应的value值
   get_json_object(buyerinfo, '$.buyerExpandInfoVo.attributionStoreId')
   
   
   get 数组值:
       含义:解析 buyerinfo string 中key 为 buyerExpandInfoVo 其对应value值为数组的第一个元素值
   get_json_object(buyerinfo, '$.buyerExpandInfoVo[0]')  
2,复合 string 类型: arry数组中元素是单个或者多个json (又是一个复合json格式) 复合j结构数据解析思路处理:
      1,去掉 string 类型数据首尾[ 和 ]:regexp_extract(itemlist, '^\\[(.+)\\]$', 1)
      2, 将1 中array 数组中元素间的分隔符转为 特殊符合:regexp_replace(regexp_extract(itemlist, '^\\[(.+)\\]$', 1), '\\},\\{"baseDiscountInfo"','\\}#@\\{"baseDiscountInfo"')
     3, 根据 2 中的特殊符号,使用split 将整个2 处理后的结果转为array类型:split(regexp_replace(regexp_extract(itemlist, '^\\[(.+)\\]$', 1), '\\},\\{"baseDiscountInfo"','\\}#@\\{"baseDiscountInfo"'),'#@')
     4, 使用 LATERAL VIEW explode 将数据炸裂,在使用json_tuple或者get_json_Object 获取指定key值即可
select
json_tuple(items, 'id', 'goodsId') as(id, goodsId)
from XXXXX
LATERAL VIEW explode(split(regexp_replace(regexp_extract(itemlist, '^\\[(.+)\\]$', 1), '\\},\\{"baseDiscountInfo"','\\}#@\\{"baseDiscountInfo"'),'#@')) views AS items
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值