创建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数据。更多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外部表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;
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
--查询数据
set odps.ext.oss.orc.native=true;
select * from <tablename>;