EMR Serverless 支持直接将 Spark SQL 的查询结果,写入您名下的 TOS 路径中,不需要额外通过下载链接或者 SDK 下载结果。
当前仅支持 Spark 引擎写入(通用计算组的 Spark 任务或 Spark 计算组的任务)。
参数名 | 参数取值 | 说明 | 是否必须 | 默认值 |
|---|---|---|---|---|
serverless.query.result.save.enabled | true / false | 是否开启结果写入tos | Y | 默认不开启该功能 |
serverless.query.result.save.mode | overwrite / errorifexists | 写入模式
| N | 默认errorifexists |
serverless.query.result.save.path | tos://test-emr/result | 结果保存目标路径 | Y | |
serverless.query.result.format | csv / parquet / json / jsonl | 结果格式 | N | 默认为parquet |
serverless.query.result.partition.num | 正整数 | 结果集的分片数 | N | 不设置默认为最后一次shuffle的partition数 |
serverless.query.result.save.compression | bzip2 / deflate / lz4 / gzip / snappy | 接入结果的压缩格式 | N | none |
CREATE TABLE if not exists all_data_types_table ( -- 布尔类型 col_boolean BOOLEAN, -- 字节类型 col_byte BYTE, -- 短整型 col_short SHORT, -- 整型 col_integer INT, -- 长整型 col_long LONG, -- 单精度浮点型 col_float FLOAT, -- 双精度浮点型 col_double DOUBLE, -- 十进制类型,精度为 10,小数位数为 2 col_decimal DECIMAL(10, 2), -- 字符串类型 col_string STRING, -- 二进制类型 col_binary BINARY, -- 日期类型 col_date DATE, -- 时间戳类型 col_timestamp TIMESTAMP, -- 数组类型,元素为字符串 col_array ARRAY<STRING>, -- 映射类型,键为字符串,值为整数 col_map MAP<STRING, INT>, -- 结构体类型,包含一个整型字段和一个字符串字段 col_struct STRUCT<struct_col1: INT, struct_col2: STRING> ); -- 向 all_data_types_table 表插入一条记录 INSERT INTO all_data_types_table VALUES ( true, CAST(1 AS BYTE), CAST(10 AS SHORT), 100, 1000L, 1.1, 1.11, DECIMAL(10.10), 'test', CAST('test' AS BINARY), DATE '2024-01-01', TIMESTAMP '2024-01-01 12:00:00', ARRAY('a', 'b'), MAP('key', 1), NAMED_STRUCT('struct_col1', 2, 'struct_col2', 'nested') );
set serverless.query.result.save.enabled = true; set serverless.query.result.format = jsonl; set serverless.query.result.save.path = tos://test-ziwen/ecs/result; set serverless.query.result.save.mode = overwrite; select * from all_data_types_table;
结果则会写入tos://test-ziwen/ecs/result 路径下,产生一个_SUCCESS 文件和多个数据文件。
打开目标文件,按 JSONL 格式组织数据,每行存储一个独立的 JSON 对象,标准格式示例如下:
{"col_boolean":true,"col_byte":1,"col_short":10,"col_integer":100,"col_long":1000,"col_float":1.1,"col_double":1.11,"col_decimal":10.00,"col_string":"test","col_binary":"dGVzdA==","col_date":"2024-01-01","col_timestamp":"2024-01-01T12:00:00.000+08:00","col_array":["a","b"],"col_map":{"key":1},"col_struct":{"struct_col1":2,"struct_col2":"nested"}}
set serverless.query.result.save.enabled = true; set serverless.query.result.format = jsonl; set serverless.query.result.save.path = tos://test-ziwen/ecs/result; set serverless.query.result.save.mode = overwrite; set serverless.query.result.partition.num = 1; select * from all_data_types_table;
结果文件数量符合预期,仅产生一个数据文件。
set serverless.query.result.save.enabled = true; set serverless.query.result.format = jsonl; set serverless.query.result.save.path = tos://test-ziwen/ecs/result; set serverless.query.result.save.mode = overwrite; set serverless.query.result.partition.num = 1; set serverless.query.result.save.compression = bzip2; select * from all_data_types_table;
通过 TOS,可以看到写出来一个 bz2 的压缩文件。