转换

描述

TRANSFORM 子句用于指定 Hive 风格的转换查询规范,通过运行用户指定的命令或脚本来转换输入。

Spark的脚本转换支持两种模式:

  1. Hive支持已禁用:Spark脚本转换可以在 spark.sql.catalogImplementation=in-memory 下运行,或者在不使用 SparkSession.builder.enableHiveSupport() 的情况下运行。在这种情况下,Spark仅使用带有 ROW FORMAT DELIMITED 的脚本转换,并将所有传递给脚本的值视为字符串。
  2. Hive支持已启用:当Spark以 spark.sql.catalogImplementation=hive 运行时,或者Spark SQL以 SparkSession.builder.enableHiveSupport() 启动时,Spark可以使用带有Hive SerDe和 ROW FORMAT DELIMITED 的脚本转换。

语法

SELECT TRANSFORM ( expression [ , ... ] )
[ ROW FORMAT row_format ]
[ RECORDWRITER record_writer_class ]
USING command_or_script [ AS ( [ col_name [ col_type ] ] [ , ... ] ) ]
[ ROW FORMAT row_format ]
[ RECORDREADER record_reader_class ]

参数

行格式定界行为

当Spark使用 ROW FORMAT DELIMITED 格式时:

Hive SerDe 行为

当启用Hive支持并使用Hive SerDe模式时:

示例

CREATE TABLE person (zip_code INT, name STRING, age INT);
INSERT INTO person VALUES
(94588, 'Zen Hui', 50),
(94588, 'Dan Li', 18),
(94588, 'Anil K', 27),
(94588, 'John V', NULL),
(94511, 'David K', 42),
(94511, 'Aryan B.', 18),
(94511, 'Lalit B.', NULL);
-- 输出指定,未指定数据类型
SELECT TRANSFORM(zip_code, name, age)
USING 'cat' AS (a, b, c)
FROM person
WHERE zip_code > 94511;
+-------+---------+-----+
| a | b| c|
+-------+---------+-----+
| 94588| Anil K| 27|
| 94588| John V| NULL|
| 94588| Zen Hui| 50|
| 94588| Dan Li| 18|
+-------+---------+-----+
-- 输出指定并指定数据类型
SELECT TRANSFORM(zip_code, name, age)
USING 'cat' AS (a STRING, b STRING, c STRING)
FROM person
WHERE zip_code > 94511;
+-------+---------+-----+
| a | b| c|
+-------+---------+-----+
| 94588| Anil K| 27|
| 94588| John V| NULL|
| 94588| Zen Hui| 50|
| 94588| Dan Li| 18|
+-------+---------+-----+
-- 使用行格式分隔
SELECT TRANSFORM(name, age)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
NULL DEFINED AS 'NULL'
USING 'cat' AS (name_age string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY LINES TERMINATED BY '\nNULL DEFINED AS FROM person;
+---------------+
| name_age|
+---------------+
| Anil K,27|
| John V,null|
| ryan B.,18|
| David K,42|
| Zen Hui,50|
| Dan Li,18|
| Lalit B.,null|
+---------------+
-- 使用 Hive Serde
SELECT TRANSFORM(zip_code, name, age)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
WITH SERDEPROPERTIES (
'field.delim' = \t)
USING AS (a STRING, b STRING, c STRING)
ROW FORMAT SERDE WITH SERDEPROPERTIES (
= \t)
FROM person
WHERE zip_code > 94511;
+-------+---------+-----+
| a | b| c|
+-------+---------+-----+
| 94588| Anil K| 27|
| 94588| John V| NULL|
| 94588| Zen Hui| 50|
| 94588| Dan Li| 18|
+-------+---------+-----+
-- 无模式模式
SELECT TRANSFORM(zip_code, name, age)
USING FROM person
WHERE zip_code > 94500;
+-------+---------------------+
| key| value|
+-------+---------------------+
| 94588| Anil K 27|
| 94588| John V \N|
| 94511| Aryan B. 18|
| 94511| David K 42|
| 94588| Zen Hui 50|
| 94588| Dan Li 18|
| 94511| Lalit B. \N|
+-------+---------------------+