Spark SQL 表的命名方式是db_name.table_name,只有数据库名称和数据表名称。如果没有指定db_name而直接引用table_name,实际上是引用default 数据库下的表。在Spark SQL中,数据库只是指定表文件存储的路径,每个表都可以使用不同的文件格式来存储数据,从这个角度来看,可以把database看作是Databricks 表的上层目录,用于组织数据表及其文件。

在python语言环境中,可以使用 %sql 切换到SQL命令模式:

%sql

一,数据库

常用的数据库命令,切换当前的数据库、显示数据库列表、表列表、视图列表和列信息:

use db_name
show databases
show tables [in db_name]
show views [in db_name]
show columns in db_name.table_name

1,创建数据库

创建数据库,通过LOCATION 指定数据库文件存储的位置:

CREATE { DATABASE | SCHEMA } [ IF NOT EXISTS ] database_name
[ LOCATION database_directory ]

LOCATION database_directory:指定存储数据库文件系统的路径,如果底层的文件系统中不存在该路径,那么需要先创建该目录。如果未指定LOCATION参数,那么使用默认的数据仓库目录来创建数据库,默认的数据仓库目录是由静态配置参数spark.sql.warehouse.dir指定的

2,查看数据库的描述

{ DESC | DESCRIBE } DATABASE [ EXTENDED ] db_name

extended 选项表示查看数据库的扩展属性。

3,删除数据库

DROP { DATABASE | SCHEMA } [ IF EXISTS ] dbname [ RESTRICT | CASCADE ]

IF EXISTS:该选项表示在数据库不存在时,DROP操作不会引发异常。
RESTRICT:该选项表示不能删除非空数据库,并在默认情况下启用。
CASCADE:该选项表示删除数据库中所有关联的表和函数。

二,创建表

表有两种作用域:全局和本地,全局表可以在所有的Cluster中引用,而本地表只能在本地的Cluster中引用,被称作临时视图。用户可以从DBFS中的文件或存储在任何受支持数据源中的数据来填充表。

在创建表时,需要指定存储表数据的文件格式,以及表数据文件存储的位置。

1,使用数据源创建表(标准的CREATE TABLE命令)

创建表的语法,注意:如果数据库中已存在同名的表,则会引发异常。

CREATE TABLE [ IF NOT EXISTS ] [db_name].table_name
[ ( col_name1 col_type1, ... ) ]
USING data_source
[ OPTIONS ( key1=val1, key2=val2, ... ) ]
[ PARTITIONED BY ( col_name1, col_name2, ... ) ]
[ CLUSTERED BY ( col_name3, col_name4, ... )
[ SORTED BY ( col_name [ ASC | DESC ], ... ) ]
INTO num_buckets BUCKETS ]
[ LOCATION path ]
[ AS select_statement ]

参数注释:

  • IF NOT EXISTS:如果数据库中已存在同名的表,则不会执行任何操作。
  • USING data_source:用于表的文件格式,data_source 必须是 TEXT、CSV、JSON、JDBC、PARQUET、ORC、HIVE、DELTA 或 LIBSVM 中的一个,或 org.apache.spark.sql.sources.DataSourceRegister 的自定义实现的完全限定的类名。支持使用 HIVE 创建 Hive SerDe 表。 你可以使用 OPTIONS 子句指定 Hive 特定的 file_format 和 row_format,这是不区分大小写的字符串映射。选项键为 FILEFORMAT、INPUTFORMAT、OUTPUTFORMAT、SERDE、FIELDDELIM、ESCAPEDELIM、MAPKEYDELIM 和 LINEDELIM。
  • OPTIONS:用于优化表的行为或配置 HIVE 表的表选项。
  • PARTITIONED BY (col_name1, col_name2, ...):按指定的列对创建的表进行分区,将为每个分区创建一个目录。
  • CLUSTERED BY col_name3, col_name4, ...):按照指定的列,把表中的分区分割到固定数目的 Bucket中,该选项通常与分区操作配合使用。delta格式的文件不支持该子句。
    • SORTED BY:数据在buckets中的排序方式,默认是升序ASC。
    • INTO num_buckets BUCKETS:bucket是一个优化技术,使用bucket(和bucket 列)来确定数据的分区,并避免数据洗牌(data shuffle),使数据变得有序。
  • LOCATION path:用于存储表数据的目录,可以指定分布式存储上的路径。
  • AS select_statement:使用来自 SELECT 语句的输出数据填充该表。

2,使用Delta Lake(增量Lake)创建表

用户可以使用标准的CREATE TABLE命令来创建存储在delta lake中的表,除了标准的创建delta table的命令之外,还可以使用以下的语法来创建delta表:

CREATE [OR REPLACE] TABLE table_identifier[(col_name1 col_type1 [NOT NULL], ...)]
USING DELTA
[LOCATION <path-to-delta-files>]

table_identifier 有两种格式:

  • [database_name.] table_name: 表的名称
  • delta.`delta_file_path` :在指定的路径上创建表,而不在元存储(metastore)中创建条目。

LOCATION <path-to-delta-files> :如果指定的 LOCATION 已包含增量 lake 中存储的数据,Delta lake 会执行以下操作:

如果仅指定了表名称和位置,例如:

CREATE TABLE events
USING DELTA
LOCATION '/mnt/delta/events'

Hive 元存储中的表会自动继承现有数据的架构、分区和表属性,此功能可用于把数据“导入”到元存储(metastore)中。

如果你指定了任何配置(架构、分区或表属性),那么 Delta Lake 会验证指定的内容是否与现有数据的配置完全匹配。如果指定的配置与数据的配置并非完全匹配,则 Delta Lake 会引发一个描述差异的异常。

3,创建表的示例

--Use data source
CREATE TABLE student (id INT, name STRING, age INT) USING PARQUET; --Use data from another table
CREATE TABLE student_copy USING PARQUET
AS SELECT * FROM student; --Omit the USING clause, which uses the default data source (parquet by default)
CREATE TABLE student (id INT, name STRING, age INT);

--Create partitioned and bucketed table
CREATE TABLE student (id INT, name STRING, age INT)
USING PARQUET
PARTITIONED BY (age)
CLUSTERED BY (Id) INTO 4 buckets;

三,和数据源的交互

数据源表的作用类似于指向基础数据源的指针,例如,您可以使用JDBC数据源在Azure Databricks中创建表foo,该表指向MySQL中的表bar。当读写表foo时,实际上就是读写表bar。

通常,CREATE TABLE会创建一个“指针”,并且必须确保它指向的对象是存在的,一个例外是文件源,例如Parquet,JSON,如果您未指定LOCATION选项,那么Azure Databricks会创建一个默认表位置。

对于CREATE TABLE AS SELECT,Azure Databricks使用select查询的输出数据来覆盖(overwrite)底层的数据源,以确保创建的表包含与输入查询完全相同的数据。

四,插入数据

用户可以向表种插入数据,也可以向Spark支持的文件中插入数据。

1,向表中插入数据

使用INSERT INTO 命令向表中追加数据,不会影响表中的现有数据;使用INSERT OVERWRITE 命令,会覆盖表中的现有数据。

INSERT INTO [ TABLE ] table_identifier [ partition_spec ]
{ VALUES ( { value | NULL } [ , ... ] ) [ , ( ... ) ] | query } INSERT OVERWRITE [ TABLE ] table_identifier [ partition_spec [ IF NOT EXISTS ] ]
{ VALUES ( { value | NULL } [ , ... ] ) [ , ( ... ) ] | query }

参数注释:

  • table_identifier:[database_name.] table_name:表名称,可选择使用数据库名称进行限定。delta.<路径到表> :现有增量表的位置。
  • partition_spec:一个可选参数,用于指定分区的键/值对的逗号分隔列表。语法:PARTITION ( partition_col_name = partition_col_val [ , ... ] )
  • 值 ( {value |NULL} [,...] ) [, ( ... ) ]:要插入的值。 显式指定的值或 NULL 。 使用逗号分隔子句中的每个值。 您可以指定多个值集来插入多个行。
  • query:生成要插入的行的查询,可用的查询格式:SELECT语句、TABLE语句、FROM语句

举个例子,创建表之后,通过VALUES子句向表中插入少量的值,也可以通过 SELECT 子句、TABLE和FROM向表中批量插入数据。

CREATE TABLE students (name VARCHAR(64), address VARCHAR(64), student_id INT)
USING PARQUET PARTITIONED BY (student_id); INSERT INTO students VALUES
('Amy Smith', '123 Park Ave, San Jose', 111111); INSERT INTO students VALUES
('Bob Brown', '456 Taylor St, Cupertino', 222222),
('Cathy Johnson', '789 Race Ave, Palo Alto', 333333); INSERT INTO students PARTITION (student_id = 444444)
SELECT name, address FROM persons WHERE name = "Dora Williams"; INSERT INTO students TABLE visiting_students; INSERT INTO students
FROM applicants SELECT name, address, id applicants WHERE qualified = true;

2,向文件中插入数据

向文件中插入数据时,只能用新数据覆盖现有的数据:

INSERT OVERWRITE [ LOCAL ] DIRECTORY [ directory_path ]
USING file_format [ OPTIONS ( key = val [ , ... ] ) ]
{ VALUES ( { value | NULL } [ , ... ] ) [ , ( ... ) ] | query }

参数注释:

  • directory_path:目标目录,还可以使用在中指定 OPTIONS path 。 LOCAL关键字用于指定目录位于本地文件系统中。
  • file_format:要用于插入的文件格式。 有效选项包括 TEXT 、 CSV 、 JSON 、 JDBC 、 PARQUET 、、、或的 ORC HIVE LIBSVM 自定义实现的完全限定类名 org.apache.spark.sql.execution.datasources.FileFormat 。
  • OPTIONS ( key = val [,...] ):指定用于写入文件格式的一个或多个选项。

参考文档:

SQL reference for Databricks Runtime 7.x

Databricks 第6篇:Spark SQL 维护数据库和表的更多相关文章

  1. SQL跨数据库复制表数据

    SQL跨数据库复制表数据   不同服务器数据库之间的数据操作 不同数据库之间复制表的数据的方法: 当表目标表存在时: insert into 目的数据库..表 select * from 源数据库.. ...

  2. 第16课-数据库开发及ado.net-数据库SQl,创建数据库和表,增删改语句,约束,top和Distinct,聚合函数介绍

    第16课-数据库开发及ado.net 数据库SQl,创建数据库和表,增删改语句,约束,top和Distinct,聚合函数介绍 SQL语句入门(脚本.命令) SQL全名是结构化查询语言(Structur ...

  3. Spark sql读取数据库和ES数据进行处理代码

    读取数据库数据和ElasticSearch数据进行连接处理 import java.util.HashMap; import java.util.List; import java.util.Map; ...

  4. 6.3 使用Spark SQL读写数据库

    Spark SQL可以支持Parquet.JSON.Hive等数据源,并且可以通过JDBC连接外部数据源 一.通过JDBC连接数据库 1.准备工作 ubuntu安装mysql教程 在Linux中启动M ...

  5. Spark 加载数据库mysql表中数据进行分析

    1.工程maven依赖包 <properties> <spark_version>2.3.1</spark_version> <!-- elasticsear ...

  6. SQL Server数据库、表、数据类型基本概念

    一.SQL Server的数据存储结构 SQL Server是一个数据库管理系统,需要以有效方式存储高容量数据.要更好地理解SQL Server处理数据的方式,就需要了解数据的存储结构. 1.文件类型 ...

  7. SQL Server数据库(表的创建)

    表的创建 1.创建列(字段):列名+类型 2.设置主键列:能够唯一表示一条数据 3.设置唯一键:设计--索引/键--添加--唯一键(选择列)--确定 唯一键的内容不能重复 4.外键关系:一张表(从表) ...

  8. SQL语句(一)SQL和数据库数据表的创建

    SQL的组成 (1) 数据定义语言DDL(Data Definition Language) 用于数据库和数据表的创建.修改和删除等操作 CREATE (create) 创建数据库.数据表 ALTER ...

  9. MS Sql Server 数据库或表修复(DBCC CHECKDB)

    MS Sql Server 提供了很多数据库修复的命令,当数据库质疑或是有的无法完成读取时可以尝试这些修复命令.  1. DBCC CHECKDB  重启服务器后,在没有进行任何操作的情况下,在SQL ...

随机推荐

  1. Object.prototype.toString.call()和typeof()区别

    js中判断数据类型都知道用tyoeof(),但是他只能判断object,boolean,function,string,number,undefined还有symbol(es6新增)这几种初步类型,比 ...

  2. JS复习之深浅拷贝

    一.复习导论(数据类型相关) 想掌握JS的深浅拷贝,首先来回顾一下JS的数据类型,JS中数据类型分为基本数据类型和引用数据类型. 基本数据类型是指存放在栈中的简单数据段,数据大小确定,内存空间大小可以 ...

  3. 传输层-Transport Layer(下):UDP与TCP报头解析、TCP滑动窗口、TCP拥塞控制详解

    第六章 传输层-Transport Layer(下) 上一篇文章对传输层的寻址方式.功能.以及流量控制方法做了简短的介绍,这一部分将介绍传输层最重要的两个实例:TCP协议和UDP协议,看一看之前描述的 ...

  4. java web简单的增删改查

    1.主要的文件,运行结果,运行界面,数据库创建的表等图片. 所要创建的文件和要导入的包: 主页面: 显示界面: 数据库的信息: 删除.查找.修改就不一 一列出来,自己可以运行看看.哈哈 2.接下来我将 ...

  5. OGG报错:Cannot load ICU resource bundle 'ggMessage', error code 2 - No such file or directory

    [oracle@dgdb1 ~]$ ggsci Oracle GoldenGate Command Interpreter for OracleVersion 11.2.1.0.3 14400833 ...

  6. CI/CD持续集成方案

    一,CI/CD流程和持续交付简介 CI(Continuous Integration)持续集成  CD(Continuous Deployment)持续部署  CD(Continuous delive ...

  7. 手把手教你:将 ClickHouse 集群迁至云上

    前言 随着云上 ClickHouse 服务完善,越来越多的用户将自建 ClickHouse 服务迁移至云上.对于不同数据规模,我们选择不同的方案: 对于数据量比较小的表,通常小于10GB 情况下,可以 ...

  8. 2020-2021-1 20209307《Linux内核原理与分析》第七周作业

    这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)> 这个作业要求在哪里 <2020-2021-1Linux内核原理与分析第七周作业> 这个作业的目标 & ...

  9. js--数组的filter()过滤方法的使用

    前言 你还在通过for循环遍历数组吗?你还在遍历之后一项一项的通过if判断过滤你需要的数据吗?你还在写着一大堆代码实现一个简单的过滤数据功能吗?那么,今天他来了.他就是这里要介绍的es6中数组filt ...

  10. 2020 .NET 开发者峰会顺利在苏州落幕,相关数据很喜人以及线上直播回看汇总

    在2019年上海中国.NET开发者大会的基础上,2020年12月19-20日 继续以"开源.共享.创新" 为主题的第二届中国 .NET 开发者峰会(.NET Conf China ...