You need to enable JavaScript to run this app.
导航
DML 语句
最近更新时间:2024.05.14 16:21:34首次发布时间:2024.05.14 16:21:34

在 Apache Spark 中,DML(Data Manipulation Language)语句用于对数据库中的数据进行操作。

假设我们有一个名为 sales 的表,其结构如下:

CREATE TABLE sales (
  date STRING,
  amount DOUBLE
)

该表将包含每天的销售数据。

1 INSERT INTO

这条语句用于将数据插入到已存在的表中。

  • 语法
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);
  • 执行结果
    表 sales 将新增两行数据:
dateamount
2023-04-01100.0
2023-04-0280.0

2 INSERT OVERWRITE

这条语句用于将数据写入表,如果表已经存在,则表会被覆盖。

  • 语法
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);
  • 执行结果
dateamount
2023-04-01300.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

3 INSERT OVERWRITE DIRECTORY

这条语句用于将数据以文件形式写入到指定目录。如果目录已存在,则会被覆盖。

  • 语法
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;
  • 执行结果
    在指定的目录 /path/to/sales_data 中将创建一个 parquet 文件,包含 sales 表中的所有数据:
date,amount
2023-04-01,100.0
2023-04-02,80.0

4 INSERT OVERWRITE DIRECTORY(Hive格式)

  • 语法
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;
  • 执行结果
    在指定的目录 /path/to/sales_data 中将创建一个 parquet 文件,包含 sales 表中的所有数据:
date,amount
2023-04-01,100.0
2023-04-02,80.0

5 LOAD

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 ",");
  • 执行结果
    如果 external_sales_data.csv 文件包含如下数据:
date,amount
2023-04-03,120.0
2023-04-04,150.0

执行上述 LOAD 语句后,sales 表将包含从 CSV 文件加载的两行新数据:

dateamount
2023-04-01100.0
2023-04-0280.0
2023-04-03120.0
2023-04-04150.0