在join 的過程中我們很容易出現資料膨脹現象,即一行變成多**況。
面對這種情況,一般會有兩種處理方式
第一種:用row_number 等分窗函式,根據不同策略取不同行的資料
第二種:將相同key對應多行的情況合併成一行,(如果一行有多個字段,還有可能合併為乙個欄位中)
如源表結構:
pcgid string
mobilegid string
value double
測試資料如下:
p1 m1 0.6
p1 m2 0.9
p2 m1 1.0
需要的結果是:
對源表進行group by之後對另外兩個字段變成key-value存成乙個map
p1 2
p2 1
查了一下,hive中沒有現成的函式可以直接得到結果。不過可以轉乙個思路,把mobilegid和value先連線成字串,然後再把整個set的結果連線成乙個字串,最後再用str_to_map,完美解決。
具體實現**通過:str_to_map、concat 和collect_set 三個函式共同完成
具體實現為:
select pcgid as gid,str_to_map(concat_ws(",",collect_set(concat_ws(':', mobilegid, cast(value as string)) ))) as gids,count(1) as num
from gemini_product_id_connect_result_pair
group by pcgid;
hive多行轉多列
一 需求 需要將多行的資料,按照某個維度轉換為一行。轉換前 轉換後 db price area name 為 東北 的total price actual db qty area name 為 東北 的qty。二 解決方案 1 sql select brand,max case when area ...
GridView合併多行多列
1 2 和並列3 4 要合併的gridview 5 開始列的索引 6 結束列的索引 7 是否合併表頭,預設不合併 8 public static void mergecolumn gridview gv,int startcol,int endcol,bool containheader false...
Oracle合併多行為多列
oracle 如何聚合多行函式 在bea論壇上看一位 專家 寫的大作,一條sql語句是 select r.xm,substr r.csrq,1,4 年 substr r.csrq,5,2 月 substr r.csrq,7,2 日 csrq,select dictvalue from zh dict...