第01章-Spark SQL简介和常用语句
  jOqYTgEXfJbg 2023年11月02日 51 0

第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;

第01章-Spark SQL简介和常用语句_hdfs

或者查看建表语句

show create table dp_data_db.lky_test;

1.2 分区和分桶

1.2.1 什么是Spark SQL的分区(partition)

spark表对应hdfs上的路径,而hdfs相当于一个文件系统,分区就相当于表路径下的二级目录。sql引擎能够根据表目录+分区目录,快速定位到用户需要的数据,避免全表扫描。

第01章-Spark SQL简介和常用语句_SQL_02

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

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
jOqYTgEXfJbg
最新推荐 更多

2024-05-31