特色功能:Schemaless Query

MaxCompute支持免定义查询(Schemaless Query)OSSParquet外部表数据,解析后的数据集结果可以导出至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,系统将默认使用AliyunODPSDefaultRole角色的ARN信息。

acs:ram::1234****:role/aliyunodpsdefaultrole

file_pattern_blacklist

正则表达式。如:

".*_SUCCESS$,.*\\.hive_staging.*"

指定需要读取的文件的黑名单。若扫描的文件名字匹配黑名单,则不读取该文件。

file_pattern_whitelist

正则表达式。如:

".*_20250124_.*.parquet"

指定需要读取的文件的白名单。只有扫描的文件名字匹配白名单,才读取该文件。

.*

使用示例

  1. 准备数据。

    登录OSS控制台,上传测试数据至OSS Bucket指定目录object-table-test/schema/。具体操作请参见OSS文件上传

    • 准备一个Parquet文件用来读取以及验证白名单参数:20250610TableSink

    • 准备一个CSV文件用来验证黑名单参数:test_oss.csv

    oss1

  2. 读取Parquet文件。

    登录MaxCompute客户端(odpscmd),执行如下SQL命令。

    • 添加test_oss.csv为黑名单参数,读取OSSParquet文件。

      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为白名单参数,读取OSSParquet文件。

      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            |
    +--------------+------------+-------------+------------+--------------+