有這這樣一張表t_buy_buyer_time_hongbao_asc
使用者id 次序 購買時間
25560 1 1325345254
25560 2 1331043510
25560 3 1331999999
25720 1 1320381121
25720 2 1320461154
25720 3 1320639271
26840 1 1337214675
26840 2 1337214694
26840 3 1337214768
37160 1 1328583075
需求是在某張表中羅列出某使用者的第一次購買時間,第二次購買時間,第三次購買時間
比如使用者id 第一次購買 第二次購買 第三次購買
25560 1325345254 1331043510 1331999999
25720 1320381121 1320461154 1320639271
26840 1337214675 1337214694 1337214768
…於是呢 打乙個很形象的比方就是 把豎表變橫表的要求
使用兩種hive指令碼來查詢hive1
select
tb1.uid as uid,
tb1.order_time as s1t_deal_time,
tb2.order_time as c2d_deal_time,
tb3.order_time as r3d_deal_time
from
(select * from t_buy_buyer_time_hongbao_asc where row_num=1 and pt=『20121010000000』)tb1
left outer join
(select * from t_buy_buyer_time_hongbao_asc where row_num=2 and pt=『20121010000000』)tb2
on tb1.uid=tb2.uid
left outer join
(select * from t_buy_buyer_time_hongbao_asc where row_num=3 and pt=『20121010000000』)tb3
on tb1.uid=tb3.uid
本hive指令碼只需要乙個job,執行時間376.005 s
hive2
select
tb1.uid as uid,
s1t_deal_time,
c2d_deal_time,
r3d_deal_time
from
(select uid,sum(if(row_num=1,order_time,0)) as s1t_deal_time,sum(if(row_num=2,order_time,0)) as c2d_deal_time,sum(if(row_num=3,order_time,0)) as r3d_deal_time from t_buy_buyer_time_hongbao_asc where pt=『20121010000000』 group by uid)tb1
本hive指令碼也只需要乙個job,執行時間是328.733 s
額,不要嫌慢,在hadoop上跑資料的確是很慢很慢的
其實執行效率被優化了五十多s,但疑問是為什麼hive1會只生成乙個job呢?原因在於我們的連線條件是同一張表的同乙個uid,於是呢,hive會做乙個效率優化。
sql實現縱表變橫表
網上所有的縱橫表轉換都是千篇一律的,參考價值都不大,而且只適合那種資料量固定的學生成績表的橫縱轉化,但是當真正遇到大資料量的批量轉換的時候是行不通的,下面介紹一種相對靈活的大量資料的橫縱表轉換 表結構 如上圖所示,其中index id中以0結尾的表示的是服務名,以1結尾的表示裝置rac名稱,2結尾的...
mysql把結果變橫表 mysql 橫表與縱表互轉
一 認識橫表與縱表 橫表就是普通的建表方式,如乙個表結構為 主鍵 欄位1 欄位2 欄位3。如果變成縱表後,則表結構為 主鍵 字段 字段值,字段 則為字段1 欄位2 欄位3。縱表對從資料庫到記憶體的對映效率是有影響的,但細一點說也要一分為二 縱表的初始對映要慢一些 縱表的變更的對映可能要快一些,如果只...
橫表縱表轉換
橫表就是普通的建表方式,如表結構為 主鍵 欄位1 欄位2 欄位3.如果變成縱表後,則表結構為 主鍵 字段 字段值。而字段 則為字段1 欄位2 欄位3.具體為電信行業的例子。以使用者帳單表為例,一般出賬時使用者有很多費用,其資料一般儲存為 時間,客戶id,費用科目,費用。這種儲存結構一般稱為縱表,其特...