首页 > 数据库 >第01章-Spark SQL简介和常用语句

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

时间:2023-09-03 19:34:30浏览次数:43  
标签:01 STRING default 分区 SQL Spark 数据

第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简介和常用语句_数据_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

标签:01,STRING,default,分区,SQL,Spark,数据
From: https://blog.51cto.com/u_12539341/7342250

相关文章

  • 力扣数据库mysql 简单题
    1.组合两张表表: Person+-------------+---------+|列名|类型|+-------------+---------+|PersonId|int||FirstName|varchar||LastName|varchar|+-------------+---------+表: Address+-------------+---------+|列名......
  • MSSQL 返回表中列的全部信息
    经常自己用到,mark一下,多表级联查询,starCoder开发过程用用到的一段代码SELECTa.column_id,a.name,b.nameASdatatype,a.max_length,a.precision,a.scale,a.is_identity,a.is_nullable,a.is_computed,g.definitionASdefaultValue,c.definitionAS......
  • 设置CITECT2018R2过程分析器游标的粗细和颜色
    这一篇在新浪博客发表过,这里再记录一遍,新浪博客地址CITECT2018R2过程分析器设置游标粗细和颜色_来自金沙江的小鱼_新浪博客(sina.com.cn)在前一个练习基础上设置一下游标的粗细和颜色,让其更加醒目。在过程分析器初始化脚本中设置游标位置添加后面设置游标粗细和颜色hCursor.w......
  • asp.net restful ef core sqlite 自定义包的位置
    MagicVilla_VillaAPI/MagicVilla_VillaAPI.csproj<ProjectSdk="Microsoft.NET.Sdk.Web"><PropertyGroup><TargetFramework>net7.0</TargetFramework><Nullable>enable</Nullable><ImplicitUsings>e......
  • 图解Spark Graphx基于connectedComponents函数实现连通图底层原理
    原创/朱季谦第一次写这么长的graphx源码解读,还是比较晦涩,有较多不足之处,争取改进。一、连通图说明连通图是指图中的任意两个顶点之间都存在路径相连而组成的一个子图。用一个图来说明,例如,下面这个叫graph的大图里,存在两个连通图。左边是一个连接图,该子图里每个顶点都存在路......
  • 东方博宜OJ1010 数组元素的排序 C语言版
    题目描述对数组的元素按从小到大进行排序。输入第一行有一个整数 n ( 5≤n≤10 );第二行有 n 个整数,每个整数的值在 [0,109]的范围内。输出输出排序后的数组。样例输入812368745输出12345678来源数组问题代码 #incl......
  • mysql
    MySQLReplication概述MySQLReplication俗称MySQLAB复制、主从复制、主从同步,是MySQL官方推荐的数据同步技术。数据同步基本过程为从数据库会实时去读取主数据库的二进制日志文件,按照日志中记录对从库进行同样的操作,以达到数据同步效果。优点:通过增加从服务器来提......
  • postgresql在插入数据后怎么获取自增id
    要获取数据库自动分配的ID(通常是主键),可以使用数据库连接对象(在这里是Connection)的相应方法来获取插入的最后一个自增ID。不同的数据库管理系统有不同的方法来实现这一点。以下是两个常见的数据库管理系统的示例:对于PostgreSQL如果你使用的是PostgreSQL数据库,可以使用RETUR......
  • sqlite 触发器 c#
    sqlite触发器我看到你在使用EntityFrameworkCore和SQLite数据库,想让别墅实体的UpdatedDate属性在更新时自动生成。这是一个使用CodeFirst的问题,关于如何配置实体属性的值生成策略(ValueGenerationStrategy)。要实现这个功能,你需要遵循以下步骤:属性注释使用[Databa......
  • 【很难啊、拆分数、观察】P6944 [ICPC2018 WF] Gem Island
    简要题面:求\(n+d\)的\(n\)正整数拆分中,最大的\(r\)个数之和的期望。首先是典中典:KeyObservation:最后的形态\(a_1\toa_n\)的概率都是一样的。Proof:考虑组合数\(\binom{d}{a_1-1,a_2-1.....,a_n-1}\)。然后我们每次在每一个\(a_i-1\)每次分裂有......