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. Geoserver对发布的数据源进行金字塔切片

    一.建立切片数据源 1.1建立工作区 1.2添加数据 我这里是老师给的高清卫星地图数据,格式为tif 工作区选择之前建立的工作区,浏览那里选择对应的文件 1.3建立切片源的图层 这里建立的图层中先不用 ...

  2. linux c++ 内存泄漏检测工具:AddressSanitizer(ASan)

    1.介绍 AddressSanitizer(ASan),该工具为gcc自带,4.8以上版本均可以使用. 2.使用 编译的方式很简单,只需要添加 -fsanitize=address -g 即可,如 g ...

  3. react-admin-plus 正式开源, 欢迎star

    简介 基于react.ant-ui.typescript的前端微服务框架.欢迎star. 在线地址 在线demo 项目介绍   沉淀了几个月的时间,这款框架终于正式的和大家见面了!   先说一下我做这 ...

  4. 【题解】「SP34013」SEUG - Seetha’s Unique Game

    这道题一看就是 贪心 . 使放的石头少,就需要石头大. 那么就可以将石头重量排序,从大到小. 这道题里面看似东西很多,但是很多东西都是没有用的.比如说:箱子的长和宽,因为题目中说「每加一个石头,水的高 ...

  5. 第三方模块Gulp

    1.第三方模块Gulp 基于node平台开发的前端构建工具. 将机械化操作编写成任务,想要执行机械化操作时执行一个命令,命令任务就能自动执行了.提高开发效率. 1)Gulp使用 ① 使用npm ins ...

  6. Maven笔记之核心概念及常用命令

    Maven的核心概念 Maven是一款服务于java平台的自动化构建工具. 自动化构建工具还有:make->ant->maven->gradle       1.约定的目录  2.P ...

  7. 移动端 FileReader文件上传

    一.file上传文件 <input type="file" multiple>   multiple 设置多选 通过change事件监听是否上传文件 files 属性获 ...

  8. pandas的学习4-处理丢失数据

    import pandas as pd import numpy as np ''' 有时候我们导入或处理数据, 会产生一些空的或者是 NaN 数据,如何删除或者是填补这些 NaN 数据就是我们今天所 ...

  9. 基于SpringBoot+Mybatis+MySQL5.7的轻语音乐网

    一个基于SpringBoot+Mybatis+MySQL5.7的轻语音乐网站项目 1.主要用到的技术: 使用maven进行项目构建 使用Springboot+Mybatis搭建整个系统 使用ajax连 ...

  10. Python Cvxopt安装及LP求解

    Python 2.7 Pycharm 1.直接File>Settings>Project>InterPreter ,点击右侧'+' 弹出Available packages窗口,搜索 ...