说明(使用 spark-sql 测试)
需求说明:假设我们现在有 3
张表,如下图所示,分别为 tra_stock_info
、tra_stock_info_ss
、 tra_stock_info_sz
我们现在需要将 tra_stock_info_ss
和 tra_stock_info_sz
的数据插入到 tra_stock_info
表中,那么我们有几种方法呢?每种方法有什么区别呢?
union
由于两个表中的数据不可能出现重复的情况,所以我们使用 union all
将查询结果进行关联,然后插入到 tra_stock_info
表中
注意:并未使用到临时表,只是把查询结果关联插入
insert overwrite table tra_stock_info
select
trade_date,
sec_code,
sec_name
from tra_stock_info_sz
union all
select
trade_date,
sec_code,
sec_name
from tra_stock_info_ss;
with…as
with as 也叫做子查询部分,首先定义一个 SQL 片段,该 SQL 片段会被整个 SQL 语句所用到,可以提高 SQL 语句的可读性,使 SQL 看起来逻辑更清晰
注意:with as 是当前 SQL 有效,可以亲自试一下,当 insert
的 SQL 执行完后,我们继续使用 t1
会发现报错不存在,因此可以总结为当前 SQL 有效
with t1 as (
select trade_date,
sec_code,
sec_name
from tra_stock_info_sz
),
t2 as (
select trade_date,
sec_code,
sec_name
from tra_stock_info_ss
)
insert
overwrite
table
tra_stock_info
select *
from t1
union all
select *
from t2;
create temporary view
如果在整个会话中多次使用某次的查询结果的话,可以把该次查询结果创建为临时视图,方便后续使用
保存的仅仅是一段查询语句的逻辑,而不是查询的结果集,使用一次就触发一次查询,如果逻辑复杂,不建议使用
注意:临时视图当前会话有效,视图则永久有效
注意:Spark 支持该语法,Hive 不支持该语法
create temporary view t1 as
select trade_date,
sec_code,
sec_name
from tra_stock_info_ss;
create temporary view t2 as
select trade_date,
sec_code,
sec_name
from tra_stock_info_sz;
insert
overwrite
table
tra_stock_info
select *
from t1
union all
select *
from t2;
cache table
将查询结果缓存到内存中,一次查询,多次使用
注意:Spark 支持该语法,Hive 不支持该语法
cache table t1 as
select trade_date,
sec_code,
sec_name
from tra_stock_info_ss;
cache table t2 as
select trade_date,
sec_code,
sec_name
from tra_stock_info_sz;
insert
overwrite
table
tra_stock_info
select *
from t1
union all
select *
from t2;