读取OSS数据

在成功创建了OSS外部表后,您可以访问和查询存储在OSS指定目录下的数据文件,实现高效的数据读取操作。

背景信息

完成OSS外部表创建后,您可以根据需要选择如下方式之一对OSS外部表进行操作:

  • (推荐)方式一:将OSS的开源格式数据导入MaxCompute内部表,然后再读取OSS的数据。

    如果直接使用OSS外部表,每次读取数据都涉及OSS的I/O操作,且MaxCompute本身针对内部存储设计的许多高性能优化都无法应用,因此性能上会有所损失。如果您需要对数据进行反复计算或对计算的高效性比较敏感,推荐先在MaxCompute项目中创建一个与OSS外部表Schema相同的内部表,然后将OSS上的数据导入MaxCompute内部表,在内部表上执行复杂查询语句,以便获得更高的计算性能。

    命令示例如下。

    CREATE TABLE <table_internal> LIKE <mc_oss_extable_name>;
    INSERT OVERWRITE TABLE <table_internal> SELECT * FROM <mc_oss_extable_name>;
  • 方式二:直接读取OSS数据,与MaxCompute内部表的操作相同。

    OSS外部表会被当作一个普通的内部表一样使用,不同之处在于,MaxCompute是直接从OSS读取对应的数据。

注意事项

在使用外部表读取OSS数据时,需要注意:

  • 您需要创建好OSS外部表后,才可以通过外部表读取OSS数据。更多MaxCompute支持的OSS数据文件类型及创建OSS外部表命令信息,请参见创建OSS外部表语法

  • SQL语句中涉及到复杂数据类型时,需要在SQL语句前添加set odps.sql.type.system.odps2=true;命令,和SQL语句一起提交执行。更多数据类型信息,请参见数据类型版本说明

  • 对于映射开源数据的OSS外部表,您需要在Session级别设置set odps.sql.hive.compatible=true;后再读取OSS数据,否则会报错。

  • OSS对外提供的带宽是有限制的,若您频繁读取OSS数据,或者大量向OSS写入数据,若短时间内产生的数据流量超过了OSS实例当前的带宽限额,就会导致带宽打满。带宽打满直接影响到OSS外表的数据读取和写入速度。于OSS带宽详情,请参见OSS有带宽和QPS限制吗?

示例:读取OSS数据-非分区表(内置文本数据解析器)

基于示例:通过内置文本数据解析器创建OSS外部表-非分区表中创建的OSS外部表mc_oss_csv_external1读取OSS数据。

使用MaxCompute客户端,从OSS读取数据。命令示例如下。

SELECT recordId, patientId, direction FROM mc_oss_csv_external1 WHERE patientId > 25;

返回结果如下。

+------------+------------+------------+
| recordid   | patientid  | direction  |
+------------+------------+------------+
| 1          | 51         | S          |
| 3          | 48         | NE         |
| 4          | 30         | W          |
| 5          | 47         | S          |
| 7          | 53         | N          |
| 8          | 63         | SW         |
| 10         | 31         | N          |
+------------+------------+------------+

示例:读取OSS数据-分区表(内置文本数据解析器)

基于示例:通过内置文本数据解析器创建OSS外部表-分区表中创建的OSS外部表mc_oss_csv_external2读取OSS数据。

使用MaxCompute客户端,从OSS读取数据。命令示例如下。

SELECT recordId, patientId, direction FROM mc_oss_csv_external2 WHERE direction = 'NE';

返回结果如下。

+------------+------------+------------+
| recordid   | patientid  | direction  |
+------------+------------+------------+
| 2          | 13         | NE         |
| 3          | 48         | NE         |
| 9          | 4          | NE         |
+------------+------------+------------+

示例:读取OSS压缩数据(内置文本数据解析器)

基于示例:通过内置文本数据解析器创建OSS外部表-压缩数据中创建的OSS外部表mc_oss_csv_external3读取OSS数据。

使用MaxCompute客户端,从OSS读取数据。命令示例如下。

SELECT recordId, patientId, direction FROM mc_oss_csv_external3 WHERE patientId > 25;
说明

如果OSS压缩数据为开源数据格式,需要在SQL语句前添加set odps.sql.hive.compatible=true;命令,与SQL语句一起提交执行。

返回结果如下。

+------------+------------+------------+
| recordid   | patientid  | direction  |
+------------+------------+------------+
| 1          | 51         | S          |
| 3          | 48         | NE         |
| 4          | 30         | W          |
| 5          | 47         | S          |
| 7          | 53         | N          |
| 8          | 63         | SW         |
| 10         | 31         | N          |
+------------+------------+------------+

示例:读取OSS文本数据(自定义解析器)

基于示例:通过自定义解析器创建OSS外部表中创建的OSS外部表ambulance_data_txt_external读取OSS数据。

使用MaxCompute客户端,从OSS读取数据。命令示例如下。

SELECT recordId, patientId, direction FROM ambulance_data_txt_external WHERE patientId > 25;

返回结果如下。

+----------+-----------+-----------+
| recordid | patientid | direction |
+----------+-----------+-----------+
| 1        | 51        | S         |
| 3        | 48        | NE        |
| 4        | 30        | W         |
| 5        | 47        | S         |
| 7        | 53        | N         |
| 8        | 63        | SW        |
| 10       | 31        | N         |
+----------+-----------+-----------+

示例:读取OSS非文本数据(自定义解析器)

基于示例:通过自定义解析器创建OSS外部表-非文本数据中创建的OSS外部表speech_sentence_snr_external读取OSS数据。

使用MaxCompute客户端,从OSS读取并处理数据。命令示例如下。

SELECT sentence_snr, id FROM speech_sentence_snr_external WHERE sentence_snr > 10.0; 

返回结果如下。

--------------------------------------------------------------
| sentence_snr |                     id                      |
--------------------------------------------------------------
|   34.4703    |          J310209090013_H02_K03_042          |
--------------------------------------------------------------
|   31.3905    | tsh148_seg_2_3013_3_6_48_80bd359827e24dd7_0 |
--------------------------------------------------------------
|   35.4774    | tsh148_seg_3013_1_31_11_9d7c87aef9f3e559_0  |
--------------------------------------------------------------
|   16.0462    | tsh148_seg_3013_2_29_49_f4cb0990a6b4060c_0  |
--------------------------------------------------------------
|   14.5568    |   tsh_148_3013_5_13_47_3d5008d792408f81_0   |
--------------------------------------------------------------

示例:读取OSS数据-OSS中的数据有不同的Schema

读取OSS外部表,当OSS数据有不同的Schema且需要根据列名称查询数据时,需要打开下面的Flag。

--查询数据
SET odps.ext.oss.orc.native=true;
SELECT * FROM <tablename>;

示例:优化查询计划

由于数据存储在外部数据湖且缺乏预先统计信息,查询优化器采用保守策略,导致查询效率低。打开下面的Flag后,该功能支持Optimizer在Query执行中临时统计表的Stats来发现小表,并主动采用Hash Join、优化Join Order、减少大量Shuffle和缩短执行的Pipeline等方法,最终优化查询计划。

SET odps.meta.exttable.stats.onlinecollect=true;
SELECT * FROM <tablename>;