直接舉栗子說明用法吧:
下面是來自APP埋點腳本獲取的一段JSON字符串:通過平台sqoop推數存放在cx_ods_safe.paczcb_paczdata_cz_policy_detail_info.data字段中
{"applicants":[{"birthday":-247478400000,
"certificateNo":"44082419620228443X",
"certificateType":"01",
"customerType":"1",
"name":"方振亞",
"phone":"13692412999",
"sex":"M"}],
"dutyInfoList":[{"dutyCode":"CV01001",
"dutyName":"機動車損失保險",
"insuredAmount":139356.8,
"seats":-999,
"totalActualPremium":1143.71},
{"dutyCode":"CV05002",
"dutyName":"機動車第三者責任保險",
"insuredAmount":1000000.0,
"seats":-999,
"totalActualPremium":1017.67},
{"dutyCode":"CV09003",
"dutyName":"機動車全車盜搶保險",
"insuredAmount":139356.8,
"seats":-999,
"totalActualPremium":406.08},
{"dutyCode":"CV13004",
"dutyName":"機動車車上人員責任保險(司機)",
"insuredAmount":20000.0,
"seats":-999,
"totalActualPremium":42.49},
{"dutyCode":"CV17005",
"dutyName":"機動車車上人員責任保險(乘客)",
"insuredAmount":10000.0,
"seats":4,
"totalActualPremium":54.63},
{"dutyCode":"CV08000",
"dutyName":"玻璃單獨破碎險",
"insuredAmount":0.0,
"seats":0,
"totalActualPremium":164.69},
{"dutyCode":"CV27027",
"dutyName":"不計免賠險(機動車損失保險)",
"insuredAmount":0.0,
"seats":-999,
"totalActualPremium":171.56},
{"dutyCode":"CV31028",
"dutyName":"不計免賠險(機動車第三者責任保險)",
"insuredAmount":0.0,
"seats":-999,
"totalActualPremium":152.65},
{"dutyCode":"CV41048",
"dutyName":"不計免賠險(機動車全車盜搶險)",
"insuredAmount":0.0,
"seats":-999,
"totalActualPremium":81.22},
{"dutyCode":"CV44049",
"dutyName":"不計免賠險(機動車車上人員責任保險(司機))",
"insuredAmount":0.0,
"seats":-999,
"totalActualPremium":6.37},
{"dutyCode":"CV49063",
"dutyName":"機動車損失保險無法找到第三方特約險",
"insuredAmount":0.0,
"seats":-999,
"totalActualPremium":28.59},
{"dutyCode":"CV44080",
"dutyName":"不計免賠險(機動車車上人員責任保險(乘客))",
"insuredAmount":0.0,
"seats":-999,
"totalActualPremium":8.19}],
"insurants":[{"address":"廣東省雷州市西湖大道79號25棟605房",
"birthday":-247478400000,
"certificateNo":"44082419620228443X",
"certificateType":"01",
"customerType":"1",
"name":"方振亞",
"phone":"13692412999","sex":"M"}],
"targets":[{"autoModelName":"炫威DHW7183RUCRE轎車",
"engineNo":"2044185",
"exhaustCapability":"1.799",
"owner":{"address":"廣東省廣州市天河區請到附近門店自取",
"birthday":-247478400000,
"certificateNo":"44082419620228443X",
"certificateType":"01",
"customerType":"1",
"name":"方春",
"phone":"18922074876",
"sex":"M"},
"ownershipAttributeCode":"03",
"registerDate":1435680000000,
"usageAttributeCode":"02",
"vehicleFrameNo":"LVHRU5804F6044188",
"vehicleLicenseCode":"粵G-JB877",
"vehicleSeats":"5",
"vehicleTonnages":"0.0"}]};
獲取json數據的思路:
-- (1)json_tuple()獲取json腳本 里面json節點dutyInfoList
-- (2)1)regexp_extract()去掉中括號[]
-- 2)regexp_extract()用雙豎線替換 },{
-- 3)split()根據雙豎線分割數組為多個小的json
-- (3)json_tuple()獲取json下dutyCode,insuredAmount等節點值
-- 其他節點的字段也可在同一個sql上取,只是每行相同且根據節點dutyInfoList確定行數
INSERT OVERWRITE TABLE DM_PACZ_APPLY_POLICY_DUTYINFOLIST
SELECT current_date AS stat_date
, a.apply_policy_no
, d.dutycode
, NVL(d.insuredamount, 0) AS insuredamount
FROM ${OdsSafeDatabase}.PACZCB_PACZDATA_CZ_POLICY_DETAIL_INFO a
LATERAL VIEW json_tuple(data, 'dutyInfoList') b AS dutyinfolist
LATERAL VIEW explode(split(regexp_replace(regexp_extract(b.dutyinfolist,'^\\[(.+)\\]$',1),'\\}\\,\\{', '\\}\\|\\|\\{'),'\\|\\|')) c AS list
LATERAL VIEW json_tuple(c.list, 'dutyCode', 'insuredAmount') d AS dutycode, insuredamount
;