在 Apache Spark 中,DML(Data Manipulation Language)语句用于对数据库中的数据进行操作。
假设我们有一个名为 sales 的表,其结构如下:
CREATE TABLE sales ( date STRING, amount DOUBLE )
该表将包含每天的销售数据。
这条语句用于将数据插入到已存在的表中。
INSERT INTO [ TABLE ] table_identifier [ partition_spec ] [ ( column_list ) ] { VALUES ( { value | NULL } [ , ... ] ) [ , ( ... ) ] | query }
INSERT INTO TABLE sales VALUES ('2023-04-01', 100.0), ('2023-04-02', 80.0);
date | amount |
---|---|
2023-04-01 | 100.0 |
2023-04-02 | 80.0 |
这条语句用于将数据写入表,如果表已经存在,则表会被覆盖。
INSERT OVERWRITE [ TABLE ] table_identifier [ partition_spec [ IF NOT EXISTS ] ] [ ( column_list ) ]{ VALUES ( { value | NULL } [ , ... ] ) [ , ( ... ) ] | query }
INSERT OVERWRITE TABLE sales VALUES ('2023-04-01', 300.0);
date | amount |
---|---|
2023-04-01 | 300.0 |
INSERT OVERWRITE
如果在 overwrite 的是分区表,且没有指定分区列的值时,比如
INSERT OVERWRITE partition_table PARTITION(a=1, b) SELECT *
Spark 会根据参数(spark.sql.sources.partitionOverwriteMode
)的设置采取不同的动作:
如果设置为STATIC
(默认):那么所有的 a=1, b=*
的分区都会被删除,然后插入具体的值
如果设置为DYNAMIC
:那么只有 SELECT
的结果中包含的那些 b 的分区才会被 overwrite
这条语句用于将数据以文件形式写入到指定目录。如果目录已存在,则会被覆盖。
INSERT OVERWRITE [ LOCAL ] DIRECTORY [ directory_path ] USING file_format [ OPTIONS ( key = val [ , ... ] ) ] { VALUES ( { value | NULL } [ , ... ] ) [ , ( ... ) ] | query }
INSERT OVERWRITE DIRECTORY '/path/to/sales_data' USING parquet SELECT * FROM sales;
date,amount 2023-04-01,100.0 2023-04-02,80.0
INSERT OVERWRITE [ LOCAL ] DIRECTORY directory_path [ ROW FORMAT row_format ] [ STORED AS file_format ] { VALUES ( { value | NULL } [ , ... ] ) [ , ( ... ) ] | query }
INSERT OVERWRITE DIRECTORY '/path/to/sales_data' ROW FORMAT DELIMITED STORED AS parquet SELECT * FROM sales;
date,amount 2023-04-01,100.0 2023-04-02,80.0
LOAD 语句用于将数据从外部存储系统加载到 Spark SQL 中。请注意,LOAD 通常与数据源选项一起使用,并且可能因 Spark 版本而异。
LOAD DATA [ LOCAL ] INPATH path [ OVERWRITE ] INTO TABLE table_identifier [ partition_spec ]
LOAD DATA LOCAL INPATH 'file:/path/to/external_sales_data.csv' INTO TABLE sales OPTIONS (header "true", delimiter ",");
date,amount 2023-04-03,120.0 2023-04-04,150.0
执行上述 LOAD 语句后,sales 表将包含从 CSV 文件加载的两行新数据:
date | amount |
---|---|
2023-04-01 | 100.0 |
2023-04-02 | 80.0 |
2023-04-03 | 120.0 |
2023-04-04 | 150.0 |