爲了測試kudu的數據遷移,需要往kudu表中大量造數,怎麼快速造1億的數據呢。比如我有一張Employees_China表(見圖),假設表中開始有100條數據。
在impala中執行的語句如下:
with temptable as
(
select 1 union all
select 2 union all
select 3 union all
select 4 union all
select 5 union all
select 6 union all
select 7 union all
select 8 union all
select 9
)
insert into table Employees_China
select
uuid() as E_ID,t1.Ename
from Employees_China as t1
join temptable on 1=1
那麼只需要運行6次就有1億的數據量
運行第1次:100*9=900+100
運行第2次:1000*9=9000+1000
運行第3次:1W*9=9W+1W
運行第4次:10W*9=90W+10W
運行第5次:100W*9=900W+100W
運行第6次: 1000W*9=9000W+1000W=1億
這裏面有幾個知識點:
1.union和union all
UNION 操作符用於合併兩個或多個 SELECT 語句的結果集。
請注意,UNION 內部的 SELECT 語句必須擁有相同數量的列。列也必須擁有相似的數據類型。同時,每條 SELECT 語句中的列的順序必須相同。
例子:
Employees_China:
Employees_USA:
SELECT E_Name FROM Employees_China UNION SELECT E_Name FROM Employees_USA
union會列出所有的僱員名,不重複
返回:
Zhang, Hua
Wang, Wei
Gates, Bill
SELECT E_Name FROM Employees_China UNION ALL SELECT E_Name FROM Employees_USA
union all 會列出所有的僱員名,會重複
Zhang, Hua
Wang, Wei
Zhang, Hua
Gates, Bill
2.笛卡爾積
兩個集合A,B
A = {0,1} B = {2,3,4}
A*B={(0,2),(1,2),(0,3),(1,3),(0,4),(1,4)}
對應sql是join
select * from Employees_China join Employees_USA
同select * from Employees_China,Employees_USA
返回結果:
join on語句
select * from Employees_China join Employees_USA on Employees_China.E_ID = Employees_USA.E_ID
同 select * from Employees_China,Employees_USA where Employees_China.E_ID = Employees_USA.E_ID
返回結果:
INNER JOIN:等同於join
LEFT JOIN: 即使右表中沒有匹配,也從左表返回所有的行
RIGHT JOIN: 即使左表中沒有匹配,也從右表返回所有的行
FULL JOIN: 結合了LEFT JOIN和RIGHT JOIN的結果
3.with as
例子:
with
a as (select * from a_table),
b as (select * from b_table)
select * from a, b where a.id = b.id;
相當於建了a、b臨時表,把一大堆重複用到的sql語句放在with as裏面,取一個別名,後面的查詢就可以用它,這樣對於大批量的sql語句起到一個優化的作用,而且清楚明瞭