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. anaconda 配置虚拟环境

    工作时有时候会遇到不同版本的问题,比如深度学习tensorflow 1.14版本 和 2.0版本,或者cpu版本和gpu版本,那么这个时候建立虚拟环境就很方便了 anaconda命令行下 1) act ...

  2. Jquery返回顶部插件

    自己jquery开发的返回顶部,当时只为了自己用一下,为了方便,修改成了插件... 自己的博客现在用的也是这个插件..使用方便!! <!DOCTYPE html> <html> ...

  3. 第 7篇 Scrum 冲刺博客

    一.站立式会议 1.站立式会议照片 2.昨天已完成的工作 对职工的查询 3.今天计划完成的工作 继续与同学对接,争取早日完成项目的整个流程 初步对数据库筛选 4.工作中遇到的困难 ①有同学不知道如何远 ...

  4. 团队作业part3--需求改进&系统设计

    一.需求&原型改进 1. 需求的修改 借鉴其他开发游戏的组的经验以及老师的建议,针对之前的需求分析,作出如下修改: 问题1:这款游戏对玩家的吸引力与驱动性有所不足. 修改1:增加成就系统与排行 ...

  5. Panda交易所视点观察:政府连发区块链建设文件,相关概念股受追捧

    日前,Panda交易所从北京市地方金融监督管理局获悉,证监会已同意在北京.苏州.上海.浙江.深圳等地区的区域性股权市场参与区块链建设工作.以上5市金融监管局将按照中国证监会的统一部署要求推进建设工作. ...

  6. 总括订单Blanket order

    总括订单Blanket order是客户向其供应方发出的采购订单,但其中包含一段时间内的多个交货日期,通常使用谈判时的预定价格.大多数情况下,它用于对消耗性商品有经常性需求的情况.总括订单通常用于客户 ...

  7. Java8新特性探索之新日期时间库

    一.为什么引入新的日期时间库 Java对日期,日历及时间的处理一直以来都饱受诟病,尤其是它决定将java.util.Date定义为可修改的以及将SimpleDateFormat实现成非线程安全的. 关 ...

  8. redis 常用基本命令

    redis 常用基本命令 redis-cli 启动set  键  值       # 存储 单条数据  # set 'zsj' 'bab' get  键        # 通过键获取值   # get ...

  9. Jmeter对数据库做压力测试

    一.环境:apache-jmeter-5.0,Oracle11g.windows7.jdk1.8.ojdbc14-10.2.0.2.0.jar二.操作配置:2.1.启动Jmeter Jmeter初始化 ...

  10. 工具-python包-虚拟环境管理(99.4.1)

    @ 目录 1.第一种方法-virtualenv 2.第二种方法-pycharm 关于作者 1.第一种方法-virtualenv 1.安装 pip install virtualenv pip inst ...