sparksql删除MySQL数据_Databricks 第6篇:Spark SQL 维护数据库和表
Spark SQL 表的命名方式是db_name.table_name,只有數(shù)據(jù)庫(kù)名稱和數(shù)據(jù)表名稱。如果沒(méi)有指定db_name而直接引用table_name,實(shí)際上是引用default 數(shù)據(jù)庫(kù)下的表。在Spark SQL中,數(shù)據(jù)庫(kù)只是指定表文件存儲(chǔ)的路徑,每個(gè)表都可以使用不同的文件格式來(lái)存儲(chǔ)數(shù)據(jù),從這個(gè)角度來(lái)看,可以把database看作是Databricks 表的上層目錄,用于組織數(shù)據(jù)表及其文件。
在python語(yǔ)言環(huán)境中,可以使用 %sql 切換到SQL命令模式:
%sql
一,管理數(shù)據(jù)庫(kù)
常用的數(shù)據(jù)庫(kù)命令,切換當(dāng)前的數(shù)據(jù)庫(kù)、顯示數(shù)據(jù)庫(kù)列表、表列表、視圖列表和列信息:
use db_nameshow databases
show tables[in db_name]show views[in db_name]show columnsin db_name.table_name
1,創(chuàng)建數(shù)據(jù)庫(kù)
創(chuàng)建數(shù)據(jù)庫(kù),通過(guò)LOCATION 指定數(shù)據(jù)庫(kù)文件存儲(chǔ)的位置:
CREATE { DATABASE | SCHEMA } [IF NOT EXISTS]database_name[LOCATION database_directory]
LOCATION database_directory:指定存儲(chǔ)數(shù)據(jù)庫(kù)文件系統(tǒng)的路徑,如果底層的文件系統(tǒng)中不存在該路徑,那么需要先創(chuàng)建該目錄。如果未指定LOCATION參數(shù),那么使用默認(rèn)的數(shù)據(jù)倉(cāng)庫(kù)目錄來(lái)創(chuàng)建數(shù)據(jù)庫(kù),默認(rèn)的數(shù)據(jù)倉(cāng)庫(kù)目錄是由靜態(tài)配置參數(shù)spark.sql.warehouse.dir指定的。
2,查看數(shù)據(jù)庫(kù)的描述
{ DESC | DESCRIBE } DATABASE [EXTENDED] db_name
extended 選項(xiàng)表示查看數(shù)據(jù)庫(kù)的擴(kuò)展屬性。
3,刪除數(shù)據(jù)庫(kù)
DROP { DATABASE | SCHEMA } [IF EXISTS] dbname [RESTRICT | CASCADE]
IF EXISTS:該選項(xiàng)表示在數(shù)據(jù)庫(kù)不存在時(shí),DROP操作不會(huì)引發(fā)異常。
RESTRICT:該選項(xiàng)表示不能刪除非空數(shù)據(jù)庫(kù),并在默認(rèn)情況下啟用。
CASCADE:該選項(xiàng)表示刪除數(shù)據(jù)庫(kù)中所有關(guān)聯(lián)的表和函數(shù)。
二,創(chuàng)建數(shù)據(jù)表
表有兩種作用域:全局和本地,全局表可以在所有的Cluster中引用,而本地表只能在本地的Cluster中引用,被稱作臨時(shí)視圖。用戶可以從DBFS中的文件或存儲(chǔ)在任何受支持?jǐn)?shù)據(jù)源中的數(shù)據(jù)來(lái)填充表。
在創(chuàng)建表時(shí),需要指定存儲(chǔ)表數(shù)據(jù)的文件格式,以及表數(shù)據(jù)文件存儲(chǔ)的位置。
1,使用數(shù)據(jù)源創(chuàng)建表(標(biāo)準(zhǔn)的CREATE TABLE命令)
創(chuàng)建表的語(yǔ)法,注意:如果數(shù)據(jù)庫(kù)中已存在同名的表,則會(huì)引發(fā)異常。
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], ... ) ]INTOnum_buckets BUCKETS ][LOCATION path]
[AS select_statement]
參數(shù)注釋:
IF NOT EXISTS:如果數(shù)據(jù)庫(kù)中已存在同名的表,則不會(huì)執(zhí)行任何操作。
USING data_source:用于表的文件格式,data_source 必須是 TEXT、CSV、JSON、JDBC、PARQUET、ORC、HIVE、DELTA 或 LIBSVM 中的一個(gè),或 org.apache.spark.sql.sources.DataSourceRegister 的自定義實(shí)現(xiàn)的完全限定的類名。支持使用 HIVE 創(chuàng)建 Hive SerDe 表。 你可以使用 OPTIONS 子句指定 Hive 特定的 file_format 和 row_format,這是不區(qū)分大小寫的字符串映射。選項(xiàng)鍵為 FILEFORMAT、INPUTFORMAT、OUTPUTFORMAT、SERDE、FIELDDELIM、ESCAPEDELIM、MAPKEYDELIM 和 LINEDELIM。
OPTIONS:用于優(yōu)化表的行為或配置 HIVE 表的表選項(xiàng)。
PARTITIONED BY (col_name1, col_name2, ...):按指定的列對(duì)創(chuàng)建的表進(jìn)行分區(qū),將為每個(gè)分區(qū)創(chuàng)建一個(gè)目錄。
CLUSTERED BY col_name3, col_name4, ...):按照指定的列,把表中的分區(qū)分割到固定數(shù)目的 Bucket中,該選項(xiàng)通常與分區(qū)操作配合使用。delta格式的文件不支持該子句。
SORTED BY:數(shù)據(jù)在buckets中的排序方式,默認(rèn)是升序ASC。
INTO num_buckets BUCKETS:bucket是一個(gè)優(yōu)化技術(shù),使用bucket(和bucket 列)來(lái)確定數(shù)據(jù)的分區(qū),并避免數(shù)據(jù)洗牌(data shuffle),使數(shù)據(jù)變得有序。
LOCATION path:用于存儲(chǔ)表數(shù)據(jù)的目錄,可以指定分布式存儲(chǔ)上的路徑。
AS select_statement:使用來(lái)自 SELECT 語(yǔ)句的輸出數(shù)據(jù)填充該表。
2,使用Delta Lake(增量Lake)創(chuàng)建表
用戶可以使用標(biāo)準(zhǔn)的CREATE TABLE命令來(lái)創(chuàng)建存儲(chǔ)在delta lake中的表,除了標(biāo)準(zhǔn)的創(chuàng)建delta table的命令之外,還可以使用以下的語(yǔ)法來(lái)創(chuàng)建delta表:
CREATE [OR REPLACE] TABLE table_identifier[(col_name1 col_type1 [NOT NULL], ...)]
USING DELTA[LOCATION ]
table_identifier 有兩種格式:
[database_name.] table_name: 表的名稱
delta.`delta_file_path`:在指定的路徑上創(chuàng)建表,而不在元存儲(chǔ)(metastore)中創(chuàng)建條目。
LOCATION :如果指定的 LOCATION 已包含增量 lake 中存儲(chǔ)的數(shù)據(jù),Delta lake 會(huì)執(zhí)行以下操作:
如果僅指定了表名稱和位置,例如:
CREATE TABLEevents
USING DELTA
LOCATION'/mnt/delta/events'
Hive 元存儲(chǔ)中的表會(huì)自動(dòng)繼承現(xiàn)有數(shù)據(jù)的架構(gòu)、分區(qū)和表屬性,此功能可用于把數(shù)據(jù)“導(dǎo)入”到元存儲(chǔ)(metastore)中。
如果你指定了任何配置(架構(gòu)、分區(qū)或表屬性),那么 Delta Lake 會(huì)驗(yàn)證指定的內(nèi)容是否與現(xiàn)有數(shù)據(jù)的配置完全匹配。如果指定的配置與數(shù)據(jù)的配置并非完全匹配,則 Delta Lake 會(huì)引發(fā)一個(gè)描述差異的異常。
3,創(chuàng)建表的示例
--Use data source
CREATE TABLE student (id INT, name STRING, age INT) USING PARQUET;--Use data from another table
CREATE TABLEstudent_copy USING PARQUETAS SELECT * FROMstudent;--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
PARTITIONEDBY(age)CLUSTERED BY (Id) INTO 4 buckets;
三,和數(shù)據(jù)源的交互
數(shù)據(jù)源表的作用類似于指向基礎(chǔ)數(shù)據(jù)源的指針,例如,您可以使用JDBC數(shù)據(jù)源在Azure Databricks中創(chuàng)建表foo,該表指向MySQL中的表bar。當(dāng)讀寫表foo時(shí),實(shí)際上就是讀寫表bar。
通常,CREATE TABLE會(huì)創(chuàng)建一個(gè)“指針”,并且必須確保它指向的對(duì)象是存在的,一個(gè)例外是文件源,例如Parquet,JSON,如果您未指定LOCATION選項(xiàng),那么Azure Databricks會(huì)創(chuàng)建一個(gè)默認(rèn)表位置。
對(duì)于CREATE TABLE AS SELECT,Azure Databricks使用select查詢的輸出數(shù)據(jù)來(lái)覆蓋(overwrite)底層的數(shù)據(jù)源,以確保創(chuàng)建的表包含與輸入查詢完全相同的數(shù)據(jù)。
四,向表插入數(shù)據(jù)
用戶可以向表種插入數(shù)據(jù),也可以向Spark支持的文件中插入數(shù)據(jù)。
1,向表中插入數(shù)據(jù)
使用INSERT INTO 命令向表中追加數(shù)據(jù),不會(huì)影響表中的現(xiàn)有數(shù)據(jù);使用INSERT OVERWRITE 命令,會(huì)覆蓋表中的現(xiàn)有數(shù)據(jù)。
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 }
參數(shù)注釋:
table_identifier:[database_name.] table_name:表名稱,可選擇使用數(shù)據(jù)庫(kù)名稱進(jìn)行限定。delta. :現(xiàn)有增量表的位置。
partition_spec:一個(gè)可選參數(shù),用于指定分區(qū)的鍵/值對(duì)的逗號(hào)分隔列表。語(yǔ)法:PARTITION ( partition_col_name = partition_col_val [ , ... ] )
值 ( {value |NULL} [,...] ) [, ( ... ) ]:要插入的值。 顯式指定的值或 NULL 。 使用逗號(hào)分隔子句中的每個(gè)值。 您可以指定多個(gè)值集來(lái)插入多個(gè)行。
query:生成要插入的行的查詢,可用的查詢格式:SELECT語(yǔ)句、TABLE語(yǔ)句、FROM語(yǔ)句
舉個(gè)例子,創(chuàng)建表之后,通過(guò)VALUES子句向表中插入少量的值,也可以通過(guò) SELECT 子句、TABLE和FROM向表中批量插入數(shù)據(jù)。
CREATE TABLE students (name VARCHAR(64), address VARCHAR(64), student_id INT)
USING PARQUET PARTITIONEDBY(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 TABLEvisiting_students;--FROM
INSERT INTOstudentsFROM applicants SELECT name, address, id applicants WHERE qualified = true;
2,向文件中插入數(shù)據(jù)
使用給定的Spark文件格式用新值覆蓋目錄中的現(xiàn)有數(shù)據(jù),也就是說(shuō),向目錄中插入數(shù)據(jù)時(shí),只能用新數(shù)據(jù)覆蓋現(xiàn)有的數(shù)據(jù):
INSERT OVERWRITE [LOCAL] DIRECTORY [directory_path]USING file_format[OPTIONS ( key = val [ , ...]) ]
{VALUES ( { value | NULL } [, ...] ) [, ( ... )] | query }
參數(shù)注釋:
directory_path:目標(biāo)目錄,還可以使用在中指定 OPTIONS path 。 LOCAL關(guān)鍵字用于指定目錄位于本地文件系統(tǒng)中。
file_format:要用于插入的文件格式。 有效選項(xiàng)包括 TEXT 、 CSV 、 JSON 、 JDBC 、 PARQUET 、ORC、HIVE、LIBSVM,或者自定義實(shí)現(xiàn)的完全限定類名 org.apache.spark.sql.execution.datasources.FileFormat 。
OPTIONS ( key = val [,...] ):指定用于寫入文件格式的一個(gè)或多個(gè)選項(xiàng)。
示例,使用新數(shù)據(jù)覆蓋目錄中的數(shù)據(jù):
INSERT OVERWRITE DIRECTORY '/tmp/destination'USING parquet
OPTIONS (col11, col2 2, col3 'test')SELECT * FROMtest_table;INSERTOVERWRITE DIRECTORY
USING parquet
OPTIONS ('path' '/tmp/destination', col1 1, col2 2, col3 'test')SELECT * FROM test_table;
參考文檔:
總結(jié)
以上是生活随笔為你收集整理的sparksql删除MySQL数据_Databricks 第6篇:Spark SQL 维护数据库和表的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: robotframework安装包_Ro
- 下一篇: mysql查询交叉连接_复杂的MySQL