一、Hive列轉行函數map
Hive列轉行函數map的作用是將Map類型的列拆成多行,每一行對應Map中的一個鍵值對。這個函數會返回兩個列,一個列包含鍵,一個列包含值。
SELECT key, value FROM table_name LATERAL VIEW explode(map_column) map_table AS key, value;
上述代碼中,table_name是你想要處理的表的名稱,map_column是你想要拆分的Map類型列的名稱。
需要注意的是,使用map函數時輸入數據必須是Map類型,否則會出錯。
二、Hive列轉行函數介紹
Hive列轉行函數是一類將多列數據轉換成多行的函數。常用的函數有:stack、inline等。
1、使用Hive列轉行函數stack
Hive列轉行函數stack將多列數據同步轉換成多行。
SELECT col1, col2, col3 FROM ( SELECT stack(3, col1, col2, col3) AS (col, value) FROM table_name ) sub_query WHERE value IS NOT NULL;
上述代碼中,table_name是你想要處理的表的名稱,col1、col2、col3是你想要進行轉換的列。這個例子中col1、col2、col3的元素數量必須相同,否則會出現錯誤。
2、使用Hive列轉行函數inline
在Hive中,列和行的關係比較複雜。如果要轉換成行,則需要使用LATERAL VIEW EXPLODE,但這種方法很麻煩。Hive開發者認為這種方法使用不方便,於是引入了Hive列轉行函數inline。
SELECT id, value FROM table_name LATERAL VIEW inline(array(col1, col2, col3)) sub_query AS value;
上述代碼中,table_name是你想要處理的表的名稱,col1、col2、col3是需要轉換的列。inline將這三個列轉換成一個數組,sub_query就是這個數組。
三、Hive列轉行函數的其他相關函數
1、Hive列轉行函數impala
Impala是Hadoop生態系統中Hive的競爭對手。Impala提供了類似於Hive的列轉行函數,例如stack和explode。
SELECT stack(3, col1, col2, col3) AS (col, value) FROM table_name;
上述代碼中col1、col2、col3是需要轉換的列,table_name是需要處理的表的名稱。
2、Oracle列轉行函數
Oracle也提供了類似於Hive的列轉行函數。unpivot是Oracle中的列轉行函數,可以將多列數據轉換成多行。
SELECT * FROM table_name UNPIVOT ( value FOR col_name IN (col1, col2, col3) );
上述代碼中,col1、col2、col3是需要轉換的列,table_name是需要處理的表的名稱。col_name是轉換後的列名,value是所有的值。
3、Hive行轉列函數
Hive行轉列函數與列轉行函數相反,將多行數據轉換成多列。
SELECT id, MAX(CASE WHEN col_name = 'col1' THEN value END) AS col1, MAX(CASE WHEN col_name = 'col2' THEN value END) AS col2, MAX(CASE WHEN col_name = 'col3' THEN value END) AS col3 FROM ( SELECT id, 'col1' AS col_name, col1 AS value FROM table_name UNION ALL SELECT id, 'col2' AS col_name, col2 AS value FROM table_name UNION ALL SELECT id, 'col3' AS col_name, col3 AS value FROM table_name ) sub_query GROUP BY id;
上述代碼中,table_name是需要處理的表的名稱,col1、col2、col3是需要進行行轉列的列。
4、Hive轉字符串函數
Hive轉字符串函數可以將多列數據拼接成一個字符串。
SELECT CONCAT_WS(',', col1, col2, col3) AS col_string FROM table_name;
上述代碼中,table_name是需要處理的表的名稱,col1、col2、col3是需要進行字符串拼接的列。CONCAT_WS函數將這三列用逗號分隔,生成一個字符串。
5、Hive列轉行拼接
Hive列轉行拼接函數可以將一列數據拆分成多行,然後將拆分出來的行拼接成一個字符串。
SELECT col, CONCAT(col_value, ',') FROM ( SELECT col, explode(split(col_string, ',')) AS col_value FROM table_name ) sub_query;
上述代碼中,table_name是需要處理的表的名稱,col_string是需要拆分的列,sub_query使用explode函數將col_string拆分成多行,然後使用CONCAT函數將這些行拼接成一個字符串。
6、Hive行轉列列轉行
Hive行轉列函數和列轉行函數是相關的。例如,這個例子是行轉列和列轉行的組合,可以將一個列的數據拆分成多行,然後將這些行進行行轉列操作,最後又進行了列轉行操作。
SELECT id, day, event, COUNT(*) AS cnt FROM ( SELECT id, day, explode(split(events, ',')) AS event FROM table_name ) sub_query GROUP BY id, day, event;
上述代碼中,table_name是需要處理的表的名稱,events是需要拆分的列,sub_query運用explode函數將events列拆分成多行,然後將這些行進行行轉列操作,再將結果進行列轉行操作。
原創文章,作者:RWDBP,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/331810.html