第01章 Spark SQL简介和常用语句 2
1.1 表 2
1.1.1什么是Spark SQL中的表 2
1.1.2 内部表和外部表 2
1.1.3视图 3
1.1.4查看表描述 3
1.2 分区和分桶 3
1.2.1 什么是Spark SQL的分区(partition) 3
1.2.2什么是Spark SQL的分桶(bucket) 4
1.3 写入数据 5
1.3.1 通过create写入数据 5
1.3.2 通过insert覆盖写入数据 5
1.3.3 通过insert覆盖写入静态分区数据 6
1.3.4 通过insert覆盖写入动态分区数据 7
1.3.5永远不要用insert追加写入数据 7
第01章 Spark SQL简介和常用语句
Spark SQL简介
Spark SQL是Spark的其中一个模块,用于处理结构化的数据。用户通过书写SQL翻译为Spark代码,提交到集群中进行并行处理。Spark SQL能够充分利用集群的硬件资源,并行处理数据,是一款能够同时运行在多台服务器上的分布式SQL引擎。
1.1 表
1.1.1什么是Spark SQL中的表
在Spark SQL中,一张完整的表由存储在hdfs上的数据以及存储在mysql中的元数据构成。元数据是对hdfs上的数据进行描述。缺失了元数据,那么hdfs上数据只是目录和文件,sql引擎无法自动处理这些数据文件。缺失了hdfs上数据,那么元数据也没有意义。对于Spark SQL引擎,数据和元数据缺一不可。通过数据和元数据,Spark SQL可以自动处理hdfs上的数据。
1.1.2 内部表和外部表
通过,执行删除表的命令时,是否删除hdfs上的数据区分内部表和外部表。如果删除表时,也需要删除hdfs上的数据,那么就定义为内部表。如果删除表时,不需要删除hdfs上的数据,那么就定义为外部表。
创建内部表
CREATE TABLE users_by_favorite_color(
name STRING comment ‘姓名,
favorite_color STRING,
favorite_numbers array<integer>
);
创建外部表
create external table users_by_favorite_color2 as select * from users_by_favorite_color;
1.1.3视图
通过提前定义好的sql创建一个永久的视图表,用户就能直接查询视图表,而不需要关心产出逻辑,可以进行sql逻辑复用。
CREATE VIEW student_view AS SELECT id, name FROM student;
1.1.4查看表描述
desc formatted dp_data_db.lky_test;
或者查看建表语句
show create table dp_data_db.lky_test;
1.2 分区和分桶
1.2.1 什么是Spark SQL的分区(partition)
spark表对应hdfs上的路径,而hdfs相当于一个文件系统,分区就相当于表路径下的二级目录。sql引擎能够根据表目录+分区目录,快速定位到用户需要的数据,避免全表扫描。
1.2.2什么是Spark SQL的分桶(bucket)
分区是分目录,分桶是分文件。根据字段进行分桶,在join时相同桶号的文件可以进行join,能够提高大数据量join性能。
CREATE TABLE users_bucketed_by_name(
name STRING,
favorite_color STRING,
favorite_numbers array<integer>
) USING orc
CLUSTERED BY(name) INTO 100 BUCKETS;
如果要使用分桶表,那么有2个需要注意事项。
(1)、两个表都使用相同数量的存储桶进行存储。如果加入表中的桶号不同,则不会生效。
(2)、两个表都存储在同一列上以进行join连接。由于数据是根据给定的分桶列进行分区的,如果我们不使用同一列进行join连接,那么您就没有使用分桶,它会影响性能。
1.3 写入数据
1.3.1 通过create写入数据
2张表结构如下:
drop table if exists default.test;
CREATE TABLE default.test(
name STRING comment '姓名',
age STRING comment 'age'
) USING orc;
drop table if exists default.test2;
CREATE TABLE default.test2(
name STRING comment '姓名',
age STRING comment 'age'
) USING orc;
从test2插入数据到test表
drop table if exists default.test;
create table default.test as select * from test2;
注意:一定要加” if exists”关键字,保证表不存在时,drop语句不报错。
1.3.2 通过insert覆盖写入数据
从default.test2查询数据覆盖写入default.test表,default.test表旧数据会被清空。
insert overwrite table default.test
select name,age from default.test2;
1.3.3 通过insert覆盖写入静态分区数据
从default.test4查询数据覆盖写入default.test3表的20230412分区,default.test3表的20230412分区旧数据会被清空,default.test3表其他分区数据不变。
2张分区表,表结构如下:
drop table if exists default.test3;
CREATE TABLE default.test3(
name STRING comment '姓名',
age STRING comment 'age',
pday STRING comment '分区'
) USING orc PARTITIONED BY(pday);
drop table if exists default.test4;
CREATE TABLE default.test4(
name STRING comment '姓名',
age STRING comment 'age',
pday STRING comment '分区'
) USING orc PARTITIONED BY(pday);
insert overwrite table default.test3 partition(pday=’20230412’ )
select name,age from default.test4;
1.3.4 通过insert覆盖写入动态分区数据
从default.test4查询所有分区数据覆盖写入default.test3表的相应分区,default.test3表的2所有相应分区旧数据会被清空,default.test3表其他分区数据不变。
举例,如果default.test4有pday=20230412,pday=20230413数据,default.test3有pday=20230414数据。那么default.test3的20230414这一天数据不会被覆盖,20230412,20230413这2天数据会被覆盖。
insert overwrite table default.test3 partition(pday )
select name,age,pday from default.test4;
1.3.5永远不要用insert追加写入数据
大数据任务必须要保证幂等性。
任务幂等,指的是对于同一段数据,触发一次任务和多次任务是能得到相同的结果。而insert into是追加数据,不能保证幂等性,所以永远不要在大数据处理引擎中使用insert into。
视频内容:《Spark SQL性能优化》
链接地址:
https://edu.51cto.com/course/34516.html