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 eventsUSING DELTALOCATION '/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 PARQUETAS 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 PARQUETPARTITIONED 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);-- VALUES
INSERT INTO students VALUES('Bob Brown', '456 Taylor St, Cupertino', 222222),('Cathy Johnson', '789 Race Ave, Palo Alto', 333333);-- SELECT
INSERT INTO students PARTITION (student_id = 444444)SELECT name, address FROM persons WHERE name = "Dora Williams";-- TABLE
INSERT INTO students TABLE visiting_students;-- FROM
INSERT INTO studentsFROM applicants SELECT name, address, id applicants WHERE qualified = true;

2,向文件中插入数据

使用给定的Spark文件格式用新值覆盖目录中的现有数据,也就是说,向目录中插入数据时,只能用新数据覆盖现有的数据:

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 [,...] ):指定用于写入文件格式的一个或多个选项。

示例,使用新数据覆盖目录中的数据:

INSERT OVERWRITE DIRECTORY '/tmp/destination'USING parquetOPTIONS (col1 1, col2 2, col3 'test')SELECT * FROM test_table;INSERT OVERWRITE DIRECTORYUSING parquetOPTIONS ('path' '/tmp/destination', col1 1, col2 2, col3 'test')SELECT * FROM test_table;

参考文档:

SQL reference for Databricks Runtime 7.x

Databricks 第6篇:Spark SQL 维护数据库和表相关推荐

  1. sparksql删除MySQL数据_Databricks 第6篇:Spark SQL 维护数据库和表

    Spark SQL 表的命名方式是db_name.table_name,只有数据库名称和数据表名称.如果没有指定db_name而直接引用table_name,实际上是引用default 数据库下的表. ...

  2. Spark SQL读数据库时不支持某些数据类型的问题(Timestamp with local Timezone)

    在大数据平台中,经常需要做数据的ETL,从传统关系型数据库RDBMS中抽取数据到HDFS中.之前开发数据湖新版本时使用Spark SQL来完成ETL的工作,但是遇到了 Spark SQL 不支持某些数 ...

  3. Spark SQL增量查询Hudi表

    前言 由于项目上主要用Hive查询Hudi,所以之前总结过一篇:Hive增量查询Hudi表.最近可能会有Spark SQL增量查询Hudi表的需求,并且我发现目前用纯Spark SQL的形式还不能直接 ...

  4. 【数据库】第一章 数据库的分类、SQL、数据库、表和表记录的常用操作

    [数据库]第一章 数据库的分类.SQL.数据库与表的常用操作 文章目录 [数据库]第一章 数据库的分类.SQL.数据库与表的常用操作 一.数据库的分类 1.关系型数据库 2.非关系型数据库 3.MyS ...

  5. Navicat for PostgreSQL 怎么维护数据库和表

    2019独角兽企业重金招聘Python工程师标准>>> Navicat for PostgreSQL一套适用于PostgreSQL数据库系统地图形化数据库管理.报告以及监控的工具.新 ...

  6. SQL Server 数据库词汇表

    SQL Server 数据库词汇表 词汇 词义 Activation 激活 ActiveX Data Objects(ADO) ActiveX 数据对象 ActiveX Data Objects(Mu ...

  7. hive编程指南电子版_第三篇|Spark SQL编程指南

    在<第二篇|Spark Core编程指南>一文中,对Spark的核心模块进行了讲解.本文将讨论Spark的另外一个重要模块--Spark SQL,Spark SQL是在Shark的基础之上 ...

  8. spark-sql建表语句限制_第三篇|Spark SQL编程指南

    在<第二篇|Spark Core编程指南>一文中,对Spark的核心模块进行了讲解.本文将讨论Spark的另外一个重要模块--Spark SQL,Spark SQL是在Shark的基础之上 ...

  9. hive编程指南_第三篇|Spark SQL编程指南

    在<第二篇|Spark Core编程指南>一文中,对Spark的核心模块进行了讲解.本文将讨论Spark的另外一个重要模块--Spark SQL,Spark SQL是在Shark的基础之上 ...

最新文章

  1. 这7款APP到底有什么好,值得知乎2万人点赞,原来如此!
  2. python中的类及self详解_Python类class参数self原理解析
  3. MIMIC 以太坊医疗项目开发(1) Express Web Server介绍
  4. Python的seaborn库(图比较炫)
  5. C# Socket编程笔记(转)
  6. 深入了解tcmalloc(一):windows环境下无缝拦截技术初探
  7. bat批处理执行python_通过批处理来运行python程序
  8. dubbo调用超时回滚_如何处理Dubbo调用超时?
  9. 一只青蛙跳向三个台阶_青蛙跳台阶问题的三种解法
  10. 庆祝喜提13337000编号,我悄悄把老板的Windows命令行设置成了这样
  11. python3.6 +tkinter GUI编程 实现界面化的文本处理工具
  12. Clojure 学习入门(12)- map/pmap
  13. 寻找开发区块链协议的完美编程语言
  14. 余承东说华为OS操作系统最快今秋面市,真的能承受之重吗??
  15. css改变权重,1. CSS 权重
  16. npm ERR! network request to https://registry.npmjs.org/axios failed, reason: Client network socket d
  17. 臭打游戏的看过来!Windows 11 22H2 这波加强直接起飞
  18. 如何将谷歌浏览器的插件下载到本地?
  19. java/php/net/pythont羽毛球场地管理系统设计
  20. android dashboard 开源,android dashboard布局

热门文章

  1. 学习LUA,使用IUP进行GUI程序设计
  2. 如何快速在线扫描文档?Web TWAIN SDK 教你轻松解决
  3. java中char类型转换成int类型的方法
  4. 安卓从服务器中下载pdf文件 然后调用第三方软件WPS Office打开
  5. 赣南师大计算机科学学院,胡文玉 - 赣南师范大学 - 数学与计算机科学学院
  6. 大型商业网站的基础架构解析
  7. 红外遥控解码原理及代码实现
  8. 【解决方案】TSINGSEE客流统计系统技术架构与使用场景解析
  9. 数控立式加工中心行业调研报告 - 市场现状分析与发展前景预测
  10. 遥感提取土地利用(从下载到ENVI到ACRGIS 【简单粗暴版】)