日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

DLA SQL技巧:行、列转换和JSON数据列展开

發布時間:2024/8/23 javascript 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 DLA SQL技巧:行、列转换和JSON数据列展开 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 簡介

在數據庫SQL處理中,常常有行轉列(Pivot)和列轉行(Unpivot)的數據處理需求。本文以示例說明在Data Lake Analytics中,如何使用SQL的一些技巧,達到行轉列(Pivot)和列轉行(Unpivot)的目的。另外,DLA支持函數式表達式的處理邏輯、豐富的JSON數據處理函數和UNNEST的SQL語法,結合這些功能,能夠實現非常豐富、強大的SQL數據處理語義和能力,本文也以JSON數據列展開為示例,說明在DLA中使用這種SQL的技巧。

2. 行轉列(Pivot)

2.1 樣例數據

test_pivot表內容:

+------+----------+---------+--------+ | id | username | subject | source | +------+----------+---------+--------+ | 1 | 張三 | 語文 | 60 | | 2 | 李四 | 數學 | 70 | | 3 | 王五 | 英語 | 80 | | 4 | 王五 | 數學 | 75 | | 5 | 王五 | 語文 | 57 | | 6 | 李四 | 語文 | 80 | | 7 | 張三 | 英語 | 100 | +------+----------+---------+--------+

2.2 方法一:通過CASE WHEN語句

SQL語句:

SELECT username,max(CASE WHEN subject = '語文' THEN source END) AS `語文`,max(CASE WHEN subject = '數學' THEN source END) AS `數學`,max(CASE WHEN subject = '英語' THEN source END) AS `英語` FROM test_pivot GROUP BY username ORDER BY username;

結果:

+----------+--------+--------+--------+ | username | 語文 | 數學 | 英語 | +----------+--------+--------+--------+ | 張三 | 60 | NULL | 100 | | 李四 | 80 | 70 | NULL | | 王五 | 57 | 75 | 80 | +----------+--------+--------+--------+

2.3 方法二:通過map_agg函數

該方法思路上分為兩個步驟:
第一步,通過map_agg函數把兩個列的多行的值,映射為map;
第二步,通過map的輸出,達到多列輸出的目的。

第一步SQL:

SELECT username, map_agg(subject, source) kv FROM test_pivot GROUP BY username ORDER BY username;

第一步輸出:

+----------+-----------------------------------+ | username | kv | +----------+-----------------------------------+ | 張三 | {語文=60, 英語=100} | | 李四 | {數學=70, 語文=80} | | 王五 | {數學=75, 語文=57, 英語=80} | +----------+-----------------------------------+

可以看到map_agg的輸出效果。

最終,該方法的SQL:

SELECTusername,if(element_at(kv, '語文') = null, null, kv['語文']) AS `語文`,if(element_at(kv, '數學') = null, null, kv['數學']) AS `數學`,if(element_at(kv, '英語') = null, null, kv['英語']) AS `英語` FROM (SELECT username, map_agg(subject, source) kvFROM test_pivotGROUP BY username ) t ORDER BY username;

結果:

+----------+--------+--------+--------+ | username | 語文 | 數學 | 英語 | +----------+--------+--------+--------+ | 張三 | 60 | NULL | 100 | | 李四 | 80 | 70 | NULL | | 王五 | 57 | 75 | 80 | +----------+--------+--------+--------+

3. 列轉行(Unpivot)

3.1 樣例數據

test_unpivot表內容:

+----------+--------+--------+--------+ | username | 語文 | 數學 | 英語 | +----------+--------+--------+--------+ | 張三 | 60 | NULL | 100 | | 李四 | 80 | 70 | NULL | | 王五 | 57 | 75 | 80 | +----------+--------+--------+--------+

3.2 方法一:通過UNION語句

SQL語句:

SELECT username, subject, source FROM (SELECT username, '語文' AS subject, `語文` AS source FROM test_unpivot WHERE `語文` is not nullUNIONSELECT username, '數學' AS subject, `數學` AS source FROM test_unpivot WHERE `數學` is not nullUNIONSELECT username, '英語' AS subject, `英語` AS source FROM test_unpivot WHERE `英語` is not null ) ORDER BY username;

結果:

+----------+---------+--------+ | username | subject | source | +----------+---------+--------+ | 張三 | 語文 | 60 | | 張三 | 英語 | 100 | | 李四 | 語文 | 80 | | 李四 | 數學 | 70 | | 王五 | 英語 | 80 | | 王五 | 語文 | 57 | | 王五 | 數學 | 75 | +----------+---------+--------+

3.3 方法二:通過CROSS JOIN UNNEST語句

SQL語句:

SELECT t1.username, t2.subject, t2.source FROM test_unpivot t1 CROSS JOIN UNNEST (array['語文', '數學', '英語'],array[`語文`, `數學`, `英語`] ) t2 (subject, source) WHERE t2.source is not null

結果:

+----------+---------+--------+ | username | subject | source | +----------+---------+--------+ | 張三 | 語文 | 60 | | 張三 | 英語 | 100 | | 李四 | 語文 | 80 | | 李四 | 數學 | 70 | | 王五 | 語文 | 57 | | 王五 | 數學 | 75 | | 王五 | 英語 | 80 | +----------+---------+--------+

4. JSON數據列展開

JSON數據的表達能力非常靈活,因此在數據庫和SQL中,常常需要處理JSON數據,常常碰到稍復雜的需求,就是將JSON數據中的某些屬性字段,進行展開轉換,轉成行、列的關系型表達。

4.1 基本思路和步驟

  • 使用JSON函數,對JSON字符串進行解析和數據提取;
  • 提取、轉換為ARRAY或者MAP的數據結構,如有需要,可以使用Lambda函數式表達式進行轉換處理;
  • 利用UNNEST語法進行列展開。

下面以多個示例說明。

4.2 用UNNEST對MAP進行關系型展開

SQL示例:

SELECT t.m, t.n FROM (SELECT MAP(ARRAY['foo', 'bar'], ARRAY[1, 2]) as map_data ) CROSS JOIN unnest(map_data) AS t(m, n);

結果:

+------+------+ | m | n | +------+------+ | foo | 1 | | bar | 2 | +------+------+

4.3 用UNNEST對JSON數據進行關系型展開

SQL示例:

SELECT json_extract(t.a, '$.a') AS a, json_extract(t.a, '$.b') AS b FROM (SELECT cast(json_extract('{"x":[{"a":1,"b":2},{"a":3,"b":4}]}', '$.x') AS array<JSON>) AS package_array ) CROSS JOIN UNNEST(package_array) AS t(a);

結果:

+------+------+ | a | b | +------+------+ | 1 | 2 | | 3 | 4 | +------+------+

SQL示例:

SELECT t.m AS _col1, t.n AS _col2 FROM (SELECT cast(json_extract('{"x":[{"a":1,"b":2},{"a":3,"b":4}]}', '$.x') AS array<JSON>) AS array_1, cast(json_extract('{"x":[{"a":5,"b":6}, {"a":7,"b":8}, {"a":9,"b":10}, {"a":11,"b":12}]}', '$.x') AS array<JSON>) AS array_2 ) CROSS JOIN UNNEST(array_1, array_2) AS t(m, n);

結果:

+---------------+-----------------+ | _col1 | _col2 | +---------------+-----------------+ | {"a":1,"b":2} | {"a":5,"b":6} | | {"a":3,"b":4} | {"a":7,"b":8} | | NULL | {"a":9,"b":10} | | NULL | {"a":11,"b":12} | +---------------+-----------------+

SQL示例:

SELECT json_extract(t.m, '$.a') AS _col1, json_extract(t.m, '$.b') AS _col2, json_extract(t.n, '$.a') AS _col3, json_extract(t.n, '$.b') AS _col4 FROM (SELECT cast(json_extract('{"x":[{"a":1,"b":2},{"a":3,"b":4}]}', '$.x') AS array<JSON>) AS array_1, cast(json_extract('{"x":[{"a":5,"b":6}, {"a":7,"b":8}, {"a":9,"b":10}, {"a":11,"b":12}]}', '$.x') AS array<JSON>) AS array_2 ) CROSS JOIN UNNEST(array_1, array_2) AS t(m, n);

結果:

+-------+-------+-------+-------+ | _col1 | _col2 | _col3 | _col4 | +-------+-------+-------+-------+ | 1 | 2 | 5 | 6 | | 3 | 4 | 7 | 8 | | NULL | NULL | 9 | 10 | | NULL | NULL | 11 | 12 | +-------+-------+-------+-------+

4.4 結合Lambda表達式,用UNNEST對JSON數據進行關系型展開

SQL示例:

SELECT count(*) AS cnt, package_name FROM ( SELECT t.a AS package_name FROM ( SELECT transform(packages_map_array, x -> Element_at(x, 'packageName')) AS package_array FROM (SELECT cast(Json_extract(data_json, '$.packages') AS array<map<VARCHAR, VARCHAR>>) AS packages_map_arrayFROM (SELECT json_parse(data) AS data_jsonFROM ( SELECT '{"packages": [{"appName": "鐵路12306","packageName": "com.MobileTicket","versionName": "4.1.9","versionCode": "194"},{"appName": "QQ飛車","packageName": "com.tencent.tmgp.speedmobile","versionName": "1.11.0.13274","versionCode": "1110013274"},{"appName": "掌閱","packageName": "com.chaozh.iReaderFree","versionName": "7.11.0","versionCode": "71101"}]}'AS data ))) ) AS x (package_array)CROSS JOIN UNNEST(package_array) AS t (a) ) GROUP BY package_name ORDER BY cnt DESC;

結果:

+------+------------------------------+ | cnt | package_name | +------+------------------------------+ | 1 | com.MobileTicket | | 1 | com.tencent.tmgp.speedmobile | | 1 | com.chaozh.iReaderFree | +------+------------------------------+


原文鏈接
本文為云棲社區原創內容,未經允許不得轉載。

總結

以上是生活随笔為你收集整理的DLA SQL技巧:行、列转换和JSON数据列展开的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 婷婷四房综合激情五月 | 亚洲av无码一区二区三区性色 | 91精品专区| 亚洲视频在线免费 | www.色播.com | 国产免费自拍视频 | 日本男人天堂网 | 三级a视频 | 亚洲精品久久久久av无码 | 国产精品1区2区3区4区 | 一区二区三区视频观看 | 91在线视频免费观看 | 午夜啪啪福利 | 椎名空在线播放 | 两性动态视频 | 国产精品久久久影院 | 7777久久亚洲中文字幕 | 麻豆最新 | 国产精品成人一区二区三区 | 麻豆私人影院 | 日日摸日日干 | 男人的天堂中文字幕 | 美女被爆操网站 | av香蕉网| jzzijzzij亚洲成熟少妇在线播放 狠狠躁日日躁夜夜躁2022麻豆 | 免费看裸体视频网站 | 91在线视频免费 | 久久久综合视频 | 国产h视频在线 | 色在线看 | 国产精品偷伦视频免费观看了 | 亚洲系列在线观看 | 日韩久久久 | 91瑟瑟| 欧美乱妇视频 | 蜜桃久久久久久 | 久久综合视频网 | 95香蕉视频 | 久久精品免费看 | 青青青青青操 | 欧美日韩一二三四区 | 久久久久激情 | 欧美一级二级视频 | 国产美女网站 | 亚洲天堂三区 | 日韩av不卡在线播放 | 人妻少妇偷人精品久久久任期 | 丝袜制服中文字幕 | 韩国日本美国免费毛片 | 少妇精品无码一区二区免费视频 | 青青青青草 | 欧美日韩免费网站 | 国产不卡视频在线观看 | 成人免费性生活视频 | 日本天堂网在线观看 | 免费a v在线 | 黑人与日本少妇高潮 | 久久精品成人一区二区三区蜜臀 | 后进极品美女白嫩翘臀 | 亚洲精品乱码久久久久久按摩观 | 91精品国产99久久久久久 | 国产ts人妖调教重口男 | 免费人成在线 | 黄色一级大片在线免费看国产 | 99国产精品久久久久99打野战 | 欧美视频在线观看一区二区 | 久久久蜜桃一区二区 | 国偷自产视频一区二区久 | 国产日韩欧美自拍 | av在线不卡免费观看 | 欧美日韩在线视频一区二区 | 午夜视频一区 | 欧美黑人一区 | 97色伦97色伦国产欧美空 | 日本一区二区三区在线观看 | 国产日韩欧美不卡 | 国产黄片一区二区三区 | 神马午夜影院 | 欧美xxxxxhd| 日本午夜免费福利视频 | 一区二区三区韩国 | 92精品| 男同志毛片特黄毛片 | 老司机深夜福利在线观看 | 黑丝国产一区 | 中文字幕88| 色久综合 | 少妇又紧又深又湿又爽视频 | 呦呦av | a视频在线观看 | 制服师生在线 | 精品熟妇一区二区三区 | 147人体做爰大胆图片成人 | 精品国产伦一区二区三区免费 | 天天色一色 | 91最新入口 | 久久久精品一区二区 | 亚洲成av人片在线观看无码 | 91精品国产日韩91久久久久久 |