MaxCompute支持免定义查询(Schemaless Query)OSS中Parquet外部表数据,解析后的数据集结果可以导出至OSS或写入内部表,同时也可以作为子查询嵌入SQL运算,从而便捷地操作湖上数据。
背景信息
使用Spark处理结构化数据的用户在进行临时数据探查时,并不需要依赖固定的数仓模型。如果输入和输出都需要定义表结构,并将OSS上的文件字段映射到外表字段,才能进行读写操作,那么后续维护分区的过程将显得相对繁琐。
若可以在使用Load指令读取Parquet外部表时,自动解析文件格式,并将数据读取为一个带有Schema的数据集(Dataset)。用户就可以直接在结果上选择部分列进行类似基于表的数据处理,生成的结果可通过Unload命令直接导出至OSS,或者通过CREATE TABLE AS导入到内部表中。也可以将该Dataset作为其他SQL的子查询,从而在SQL运算中灵活使用MaxCompute操作湖上的数据。
使用限制
Schemaless Query暂不支持把OSS Bucket中的子目录当作分区处理。
语法结构
SELECT *, <col_name>, <table_alias>.<col_name>
FROM
LOCATION '<location_path>'
('key'='value' [, 'key1'='value1', ...])
[AS <table_alias>];
参数说明
参数 | 是否必填 | 说明 |
* | 是 | 查询Parquet文件中的所有字段。 |
col_name | 是 | 查询Parquet文件中已知列名的字段。 |
table_alias.col_name | 是 | 查询Parquet文件中已知列名的字段,以表别名和字段名完整路径方式表达。 |
table_alias | 否 | 自定义表别名。 |
location_path | 是 | Parquet文件的location,必须是一个oss目录,结构为oss://oss_endpoint/bucket_name/path/。 path的下一级支持partition_name=partition_value格式的分区目录。 说明 Schemaless Query暂不支持把location中的子目录当作分区处理,因此不支持分区裁剪。 |
key&value | 是 | 查询语句的参数和参数值。详情如下表。 |
key&value可选参数:
key | value | 是否必填 | 说明 | 默认值 |
file_format | parquet | 是 | 指定Location文件的格式仅支持Parquet,其他格式将报错并提示不支持。 | parquet |
rolearn | acs:ram::xxxxxx:role/aliyunodpsdefaultrole | 否 | 指定访问Location所需Rolearn。您可以通过RAM控制台中的角色页面搜索AliyunODPSDefaultRole进行获取。 说明 在SQL语句中,如果未指定Rolearn,系统将默认使用 | acs:ram::1234****:role/aliyunodpsdefaultrole |
file_pattern_blacklist | 正则表达式。如:
| 否 | 指定需要读取的文件的黑名单。若扫描的文件名字匹配黑名单,则不读取该文件。 | 无 |
file_pattern_whitelist | 正则表达式。如:
| 否 | 指定需要读取的文件的白名单。只有扫描的文件名字匹配白名单,才读取该文件。 |
|
使用示例
准备数据。
登录OSS控制台,上传测试数据至OSS Bucket指定目录
object-table-test/schema/
。具体操作请参见OSS文件上传。准备一个Parquet文件用来读取以及验证白名单参数:20250610TableSink。
准备一个CSV文件用来验证黑名单参数:test_oss.csv
读取Parquet文件。
登录MaxCompute客户端(odpscmd),执行如下SQL命令。
添加
test_oss.csv
为黑名单参数,读取OSS的Parquet文件。SELECT tinyint_name, int_name, binary_name, float_name,varchar_name FROM location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/object-table-test/schema/' ( 'file_format'='parquet', 'rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole', 'file_pattern_blacklist'='.*test_oss.*' );
添加
20250610TableSink
为白名单参数,读取OSS的Parquet文件。SELECT tinyint_name, int_name, binary_name, float_name, varchar_name FROM location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/object-table-test/schema/' ( 'file_format'='parquet', 'rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole', 'file_pattern_whitelist'='.*20250610TableSink.*' );
以上参数配置情形,均在读取
20250610TableSink
文件,返回结果如下:+--------------+------------+-------------+------------+--------------+ | tinyint_name | int_name | binary_name | float_name | varchar_name | +--------------+------------+-------------+------------+--------------+ | 1 | 100 | abc | 3.14 | N | +--------------+------------+-------------+------------+--------------+