为了测试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语句起到一个优化的作用,而且清楚明了