日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

文檔

創建OSS外部表

更新時間:

MaxCompute支持您在項目中創建OSS(Object Storage Service)外部表,與存儲服務OSS上的目錄建立映射關系,您可以通過OSS外部表訪問OSS目錄下的數據文件中的非結構化數據,或將MaxCompute項目中的數據寫入OSS目錄。本文為您介紹創建OSS外部表的語法、參數信息并提供示例。

背景信息

對象存儲服務OSS是一種海量、安全、低成本、高可靠的云存儲服務,適合存放任意類型的數據文件。當您需要使用MaxCompute讀取存儲在OSS目錄中的數據或需要將MaxCompute項目中的數據寫入OSS目錄時,可以在MaxCompute項目中創建OSS外部表,以建立與目錄的映射關系。

OSS外部表包含分區表和非分區表兩種類型,實際需要創建哪種類型的表,主要取決于OSS中數據文件的存儲路徑格式。當數據文件以分區路徑方式存儲時,需要創建分區表;否則創建非分區表。更多讀取分區數據信息,請參見讀取以分區方式存儲的OSS數據

前提條件

在創建OSS外部表前,請確認執行操作的賬號已滿足如下條件:

  • 已授予訪問OSS的權限。

    更多授權信息,請參見OSS的STS模式授權

  • 已具備在MaxCompute項目中創建表(CreateTable)的權限。

    更多表操作權限信息,請參見MaxCompute權限

注意事項

在使用OSS外部表時,您需要注意:

  • 對于不同格式的數據文件,創建OSS外部表語句僅個別參數設置有出入,請您仔細閱讀創建OSS外部表語法及參數說明,確保創建符合實際業務需求的外部表,否則讀取OSS數據或將數據寫入OSS操作會執行失敗。

  • OSS外部表只是記錄與OSS目錄的映射關系。當刪除OSS外部表時,不會刪除映射的OSS目錄下的數據文件。

  • 如果OSS數據文件類型為歸檔文件,需要先解凍文件。更多解凍操作,請參見解凍文件

  • 需使用OSS經典網絡域名。對于公網的網絡域名,MaxCompute不保證網絡連通性。

使用限制

OSS外部表不支持cluster屬性。

操作入口

MaxCompute支持您在如下平臺創建OSS外部表。

創建方式

平臺

基于MaxCompute SQL創建OSS外部表

MaxCompute客戶端

使用DataWorks連接

DataWorks控制臺-ODPS SQL節點

MaxCompute Studio-SQL程序

以可視化方式創建OSS外部表

MaxCompute Studio-SQL程序

DataWorks控制臺-外部表

創建OSS外部表語法

創建OSS外部表的場景、相應語法格式及示例如下。詳細語法參數及屬性列表信息,請參見參考:語法參數說明參考:with serdeproperties屬性列表參考:tblproperties屬性列表

場景

語法格式

支持讀取或寫入OSS的數據文件格式

示例

通過內置文本數據解析器創建外部表

CREATE EXTERNAL TABLE [IF NOT EXISTS] <mc_oss_extable_name> 
(
<col_name> <data_type>,
...
)
[partitioned BY (<col_name> <data_type>, ...)] 
stored BY '<StorageHandler>'  
WITH serdeproperties (
 ['<property_name>'='<property_value>',...]
) 
location '<oss_location>';
  • CSV

  • 以GZIP方式壓縮的CSV

  • TSV

  • 以GZIP方式壓縮的TSV

通過內置開源數據解析器創建外部表

CREATE EXTERNAL TABLE [IF NOT EXISTS] <mc_oss_extable_name>
(
<col_name> <data_type>,
...
)
[partitioned BY (<col_name> <data_type>, ...)]
[row format serde '<serde_class>'
  [WITH serdeproperties (
    ['<property_name>'='<property_value>',...])
  ]
]
stored AS <file_format> 
location '<oss_location>' 
[USING '<resource_name>']
[tblproperties ('<tbproperty_name>'='<tbproperty_value>',...)];
  • PARQUET

  • 以SNAPPY、GZIP或LZO方式壓縮的PARQUET

  • TEXTFILE(JSON、TEXT)

  • 以SNAPPY、LZO、BZ2、GZ、DEFLATE方式壓縮的TEXTFILE

  • ORC

  • 以SNAPPY、ZLIB方式壓縮的ORC

  • RCFILE

  • AVRO

  • SEQUENCEFILE

說明

僅支持讀取DLF生成的Hudi數據。

示例:通過內置開源數據解析器創建OSS外部表

通過自定義解析器創建外部表

CREATE EXTERNAL TABLE [IF NOT EXISTS] <mc_oss_extable_name> 
(
<col_name> <date_type>,
...
)
[partitioned BY (<col_name> <data_type>, ...)] 
stored BY '<StorageHandler>' 
WITH serdeproperties (
 ['<property_name>'='<property_value>',...]
) 
location '<oss_location>' 
USING '<jar_name>';

除上述格式外的數據文件。

說明

補全OSS外部表分區數據語法

當您創建的OSS外部表為分區表時,需要額外執行引入分區數據的操作。

  • 方式一(推薦):自動解析OSS目錄結構,識別分區,為OSS外部表添加分區信息。

    通過這種方式,MaxCompute會根據您創建OSS外部表時指定的分區目錄,自動補全OSS外部表的分區,而不用逐個按照分區列名和名稱增加,這適用于一次性補全全部缺失的歷史分區的場景,

    msck repair TABLE <mc_oss_extable_name> ADD partitions [ WITH properties (key:VALUE, key: VALUE ...)];
    說明

    該方式不適用于處理增量數據的補充,尤其是在OSS目錄包含大量分區(如超過1000個)的情況下。由于當新增分區遠少于已有分區時,頻繁使用msck命令會導致對OSS目錄大量的重復掃描和元數據更新請求,這將顯著降低命令執行的效率。因此,對于需要更新增量分區的場景,建議您采用方式二。

  • 方式二:手動執行如下命令為OSS外部表添加分區信息。

    當歷史分區已經創建完成,需要頻繁地周期性追加分區,建議采用該方式,在執行數據寫入任務之前提前創建好分區。分區創建完成后,即使OSS上有新數據寫入,也無需刷新對應分區,外部表即可讀取OSS目錄上的最新數據。

    ALTER TABLE < mc_oss_extable_name >
        ADD PARTITION (< col_name >= < col_value >)[
    ADD PARTITION (< col_name >= < col_value >)...][location URL];

    col_namecol_value的值需要與分區數據文件所在目錄名稱對齊。假設,分區數據文件所在的OSS目錄結構如下圖,col_name對應directioncol_value對應N、NE、S、SW、W。一個add partition對應一個子目錄,多個OSS子目錄需要使用多個add partition分區路徑

  • 示例

    1. 在OSS上創建目錄demo8并分別在下面建立兩個分區文件夾,分別放入對應的文件。

      • 分區文件夾:$pt1=1/$pt2=2,文件名稱:demo8-pt1.txt分區文件pt1

      • 分區文件夾:$pt1=3/$pt2=4,文件名稱:demo8-pt2.txt分區文件pt2

    2. 創建外部表并指定pt字段。

      --創建外部表
      CREATE EXTERNAL TABLE mf_oss_spe_pt (id int, name string)
      partitioned BY (pt1 string, pt2 string)
      stored AS TEXTFILE
      location "oss://oss-cn-beijing-internal.aliyuncs.com/mfoss*******/demo8/";
      
      --指定分區字段
      MSCK REPAIR TABLE  mf_oss_spe_pt ADD PARTITIONS
      WITH PROPERTIES ('odps.msck.partition.column.mapping'='pt1:$pt1,pt2:$pt2');
      
      --查詢數據
      SELECT * FROM mf_oss_spe_pt WHERE pt1=1 AND pt2=2;
      --返回
      +------------+------------+------------+------------+
      | id         | name       | pt1        | pt2        |
      +------------+------------+------------+------------+
      | 1          | kyle       | 1          | 2          |
      | 2          | nicole     | 1          | 2          |
      +------------+------------+------------+------------+
      --查詢數據
      SELECT * FROM mf_oss_spe_pt WHERE pt1=3 AND pt2=4;
      +------------+------------+------------+------------+
      | id         | name       | pt1        | pt2        |
      +------------+------------+------------+------------+
      | 3          | john       | 3          | 4          |
      | 4          | lily       | 3          | 4          |
      +------------+------------+------------+------------+                                
    3. 當OSS外表中的分區列名與OSS的目錄結構不一致時,需要指定目錄。

      --MaxCompute分區與OSS的目錄對應如下:
      --pt1=8-->8
      --pt2=8-->$pt2=8
      --添加分區
      ALTER TABLE mf_oss_spe_pt ADD PARTITION (pt1=8,pt2=8)
            location 'oss://oss-cn-beijing-internal.aliyuncs.com/mfosscostfee/demo8/8/$pt2=8/';
      --需要關閉commit mode
      --插入數據
      SET odps.sql.unstructured.oss.commit.mode=false;
      INSERT INTO mf_oss_spe_pt PARTITION (pt1=8,pt2=8) VALUES (1,'tere');
      --查詢數據
      SET odps.sql.unstructured.oss.commit.mode=false;
      SELECT * FROM mf_oss_spe_pt WHERE pt1=8 AND pt2=8;
      +------+------+-----+-----+
      | id   | name | pt1 | pt2 |
      +------+------+-----+-----+
      | 1    | tere | 8   | 8   |
      +------+------+-----+-----+                                

示例:數據準備

為便于理解,為您提供示例數據如下:

  • oss_endpointoss-cn-hangzhou-internal.aliyuncs.com,即華東1(杭州)。

  • Bucket名稱oss-mc-test

  • 目錄名稱Demo1/Demo2/Demo3/SampleData/

    上述四個目錄下分別上傳以下數據文件:

    • Demo1/目錄下上傳的文件為vehicle.csv,用于和通過內置文本數據解析器創建的非分區表建立映射關系。文件中包含的數據信息如下。

      1,1,51,1,46.81006,-92.08174,9/14/2014 0:00,S
      1,2,13,1,46.81006,-92.08174,9/14/2014 0:00,NE
      1,3,48,1,46.81006,-92.08174,9/14/2014 0:00,NE
      1,4,30,1,46.81006,-92.08174,9/14/2014 0:00,W
      1,5,47,1,46.81006,-92.08174,9/14/2014 0:00,S
      1,6,9,1,46.81006,-92.08174,9/15/2014 0:00,S
      1,7,53,1,46.81006,-92.08174,9/15/2014 0:00,N
      1,8,63,1,46.81006,-92.08174,9/15/2014 0:00,SW
      1,9,4,1,46.81006,-92.08174,9/15/2014 0:00,NE
      1,10,31,1,46.81006,-92.08174,9/15/2014 0:00,N
    • Demo2/目錄下包含五個子目錄direction=N/direction=NE/direction=S/direction=SW/direction=W/,分別上傳的文件為vehicle1.csv、vehicle2.csv、vehicle3.csv、vehicle4.csv和vehicle5.csv,用于和通過內置文本數據解析器創建的分區表建立映射關系。文件中包含的數據信息如下。

      --vehicle1.csv
      1,7,53,1,46.81006,-92.08174,9/15/2014 0:00
      1,10,31,1,46.81006,-92.08174,9/15/2014 0:00
      
      --vehicle2.csv
      1,2,13,1,46.81006,-92.08174,9/14/2014 0:00
      1,3,48,1,46.81006,-92.08174,9/14/2014 0:00
      1,9,4,1,46.81006,-92.08174,9/15/2014 0:00
      
      --vehicle3.csv
      1,6,9,1,46.81006,-92.08174,9/15/2014 0:00
      1,5,47,1,46.81006,-92.08174,9/14/2014 0:00
      1,6,9,1,46.81006,-92.08174,9/15/2014 0:00
      
      --vehicle4.csv
      1,8,63,1,46.81006,-92.08174,9/15/2014 0:00
      
      --vehicle5.csv
      1,4,30,1,46.81006,-92.08174,9/14/2014 0:00

      Demo2

    • Demo3/目錄下上傳的文件為vehicle.csv.gz,壓縮包內文件為vehicle.csv,與Demo1/目錄下的文件內容相同,用于和攜帶壓縮屬性的OSS外部表建立映射關系。壓縮

    • SampleData/目錄下上傳的文件為vehicle6.csv,用于和通過開源數據解析器創建的OSS外部表建立映射關系。文件中包含的數據信息如下。

      1|1|51|1|46.81006|-92.08174|9/14/2014 0:00|S
      1|2|13|1|46.81006|-92.08174|9/14/2014 0:00|NE
      1|3|48|1|46.81006|-92.08174|9/14/2014 0:00|NE
      1|4|30|1|46.81006|-92.08174|9/14/2014 0:00|W
      1|5|47|1|46.81006|-92.08174|9/14/2014 0:00|S
      1|6|9|1|46.81006|-92.08174|9/14/2014 0:00|S
      1|7|53|1|46.81006|-92.08174|9/14/2014 0:00|N
      1|8|63|1|46.81006|-92.08174|9/14/2014 0:00|SW
      1|9|4|1|46.81006|-92.08174|9/14/2014 0:00|NE
      1|10|31|1|46.81006|-92.08174|9/14/2014 0:00|N

示例:通過內置文本數據解析器創建OSS外部表-非分區表

示例:數據準備中的Demo1/目錄建立映射關系。創建OSS外部表命令示例如下。

create external table if not exists mc_oss_csv_external1
(
vehicleId int,
recordId int,
patientId int,
calls int,
locationLatitute double,
locationLongtitue double,
recordTime string,
direction string
)
stored by 'com.aliyun.odps.CsvStorageHandler' 
with serdeproperties (
 'odps.properties.rolearn'='acs:ram::xxxxxx:role/aliyunodpsdefaultrole'
) 
location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/oss-mc-test/Demo1/';

您可以執行desc extended mc_oss_csv_external1;命令查看創建好的OSS外部表結構信息。

示例:通過內置文本數據解析器創建OSS外部表-分區表

示例:數據準備中的Demo2/目錄建立映射關系。創建OSS外部表并引入分區數據命令示例如下。

create external table if not exists mc_oss_csv_external2
(
vehicleId int,
recordId int,
patientId int,
calls int,
locationLatitute double,
locationLongtitue double,
recordTime string
)
partitioned by (
direction string
)
stored by 'com.aliyun.odps.CsvStorageHandler' 
with serdeproperties (
 'odps.properties.rolearn'='acs:ram::xxxxxx:role/aliyunodpsdefaultrole'
) 
location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/oss-mc-test/Demo2/';
--引入分區數據。
msck repair table mc_oss_csv_external2 add partitions;
--等效于如下語句。
alter table mc_oss_csv_external2 add partition (direction = 'N') partition (direction = 'NE') partition (direction = 'S') partition (direction = 'SW') partition (direction = 'W');

您可以執行desc extended mc_oss_csv_external2;命令查看創建好的外部表結構信息。

示例:通過內置文本數據解析器創建OSS外部表-壓縮數據

示例:數據準備中的Demo3/目錄建立映射關系。創建OSS外部表命令示例如下。

create external table if not exists mc_oss_csv_external3
(
vehicleId int,
recordId int,
patientId int,
calls int,
locationLatitute double,
locationLongtitue double,
recordTime string,
direction string
)
stored by 'com.aliyun.odps.CsvStorageHandler' 
with serdeproperties (
 'odps.properties.rolearn'='acs:ram::xxxxxx:role/aliyunodpsdefaultrole',
 'odps.text.option.gzip.input.enabled'='true',
 'odps.text.option.gzip.output.enabled'='true' 
) 
location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/oss-mc-test/Demo3/';

您可以執行desc extended mc_oss_csv_external3;命令查看創建好的外部表結構信息。

示例:通過內置開源數據解析器創建OSS外部表

  • 映射PARQUET數據文件

    CREATE EXTERNAL TABLE [IF NOT EXISTS] <mc_oss_extable_name>
    (
    <col_name> <data_type>,
    ...
    )
    [partitioned BY (<col_name> <data_type>, ...)]
    stored AS parquet  
    location '<oss_location>';
    SELECT ... FROM <mc_oss_extable_name> ...;
  • 映射TEXTFILE數據文件

    • 關聯TEXT數據建表示例

      CREATE EXTERNAL TABLE [IF NOT EXISTS] <mc_oss_extable_name>
      (
      <col_name> <data_type>,
      ...
      )
      [partitioned BY (<col_name> <data_type>, ...)]
      row format serde 'org.apache.hive.hcatalog.data.JsonSerDe'
      stored AS textfile
      location '<oss_location>';
      SELECT ... FROM <mc_oss_extable_name> ...;

      建表時不支持自定義row formatrow format默認值如下。

      FIELDS TERMINATED BY :'\001'
      ESCAPED BY :'\'
      COLLECTION ITEMS TERMINATED BY :'\002'
      MAP KEYS TERMINATED BY :'\003'
      LINES TERMINATED BY :'\n'
      NULL DEFINED AS :'\N'
    • 關聯CSV數據建表示例

      --關閉native的text reader。
      SET odps.ext.hive.lazy.simple.serde.native=false;
      --創建OSS外部表。
      CREATE EXTERNAL TABLE <mc_oss_extable_name>
      (
      <col_name> <data_type>,
      ...
      )
      row format serde 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
      WITH serdeproperties (
      "separatorChar" = ",",
      "quoteChar"= '"',
      "escapeChar"= "\\"
      )
      stored AS textfile
      location '<oss_location>'
      tblproperties (
      "skip.header.line.count"="1",
      "skip.footer.line.count"="1"
      );
      SELECT ... FROM <mc_oss_extable_name> ...;
      說明

      OpenCSVSerde只支持STRING類型。

    • 關聯JSON數據建表示例

      CREATE EXTERNAL TABLE [IF NOT EXISTS] <mc_oss_extable_name>
      (
      <col_name> <data_type>,
      ...
      )
      [partitioned BY (<col_name> <data_type>, ...)]
      row format serde 'org.apache.hive.hcatalog.data.JsonSerDe'
      stored AS textfile
      location '<oss_location>';
      SELECT ... FROM <mc_oss_extable_name> ...;
  • 映射ORC數據文件

    CREATE EXTERNAL TABLE [IF NOT EXISTS] <mc_oss_extable_name>
    (
    <col_name> <data_type>,
    ...
    )
    [partitioned BY (<col_name> <data_type>, ...)]
    stored AS orc
    location '<oss_location>';
    SELECT ... FROM <mc_oss_extable_name> ...;
    說明

    具體示例,請參見OSS外部表根據字段名稱Mapping數據

  • 映射RCFILE數據文件

    CREATE EXTERNAL TABLE [IF NOT EXISTS] <mc_oss_rcfile_extable>
    (
    <col_name> <data_type>,
    ...
    )
    [partitioned BY (<col_name> <data_type>, ...)]
    row format serde 'org.apache.hadoop.hive.serde2.columnar.LazyBinaryColumnarSerDe'
    stored AS rcfile
    location '<oss_location>';
    SELECT ... FROM <mc_oss_rcfile_extable> ...;
  • 映射AVRO數據文件

    CREATE EXTERNAL TABLE [IF NOT EXISTS] <mc_oss_extable_name>
    (
    <col_name> <data_type>,
    ...
    )
    [partitioned BY (<col_name> <data_type>, ...)]
    stored AS avro
    location '<oss_location>';
    SELECT ... FROM <mc_oss_extable_name> ...;
  • 映射SEQUENCEFILE數據文件

    CREATE EXTERNAL TABLE [IF NOT EXISTS] <mc_oss_extable_name>
    (
    <col_name> <data_type>,
    ...
    )
    [partitioned BY (<col_name> <data_type>, ...)]
    stored AS sequencefile
    location '<oss_location>';
    SELECT ... FROM <mc_oss_extable_name> ...;
  • 映射Hudi格式數據文件

    說明
    • Hudi外表只支持讀取外表映射的全部文件的數據,不支持自動隱藏系統列,不支持增量讀、快照讀操作,不支持寫操作。建議您使用MaxCompute Delta表或Paimon外部表等功能實現ACID方式的讀寫操作。

    • MaxCompute系統默認集成的Hudi SDK版本為org.apache.hudi:hudi-hadoop-mr-bundle:0.12.2-emr-1.0.6,無法保證Hudi SDK向前或向后兼容,兼容性由開源社區保證。

    • MaxCompute將提供支持用戶上傳jar并指定SDK兼容版本的方式創建外表,用于讀取兼容特定版本的數據。

    CREATE EXTERNAL TABLE [IF NOT EXISTS] <mc_oss_extable_name>
    (
    <col_name> <data_type>,
    ...
    )
    [partitioned BY (<col_name> <data_type>, ...)]
    ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
    stored AS 
    INPUTFORMAT 'org.apache.hudi.hadoop.HoodieParquetInputFormat'
    OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
    location '<oss_location>';
    SELECT ... FROM <mc_oss_extable_name> ...;
  • 映射Delta Lake格式數據文件

    說明
    • Delta Lake外表只支持讀取外表映射的全部文件的數據,不支持自動隱藏系統列,不支持增量讀、快照讀操作,不支持寫操作。建議您使用MaxCompute Delta表或Paimon外部表等功能實現ACID方式的讀寫操作。

    • MaxCompute系統默認集成的Delta Lake SDK版本為io.delta:delta-core_2.11:0.2.0.5,無法保證Delta Lake SDK向前或向后兼容,兼容性由開源社區保證。

    • MaxCompute將提供支持用戶上傳jar并指定SDK兼容版本的方式創建外表,用于讀取兼容特定版本的數據。

    CREATE EXTERNAL TABLE [IF NOT EXISTS] <mc_oss_extable_name> (
       <col_name> <data_type>,
       ...
    )
    [partitioned BY (<col_name> <data_type>, ...)]
    ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
    STORED AS
    INPUTFORMAT 'io.delta.hive.DeltaInputFormat'
    OUTPUTFORMAT 'io.delta.hive.DeltaOutputFormat'
    LOCATION '<oss_location>';
    SELECT ... FROM <mc_oss_extable_name> ...;
  • 映射Paimon格式數據文件

    CREATE EXTERNAL TABLE [IF NOT EXISTS] <mc_oss_extable_name>
    (
    <col_name> <data_type>,
    ...
    )
    [partitioned BY (<col_name> <data_type>, ...)]
    stored BY 'org.apache.paimon.hive.PaimonStorageHandler'
    WITH serdeproperties (
        'odps.properties.rolearn'='acs:ram::xxxxxxxxxxxxx:role/aliyunodpsdefaultrole'
    )
    location '<oss_location>'
    USING 'paimon_maxcompute_connector.jar';

    paimon_maxcompute_connector.jar需要預先上傳至MaxCompute項目,詳情請參見Paimon外部表

示例:通過自定義解析器創建OSS外部表

示例:數據準備中的SampleData/目錄建立映射關系。

操作流程如下:

  1. 使用MaxCompute Studio開發TextExtractor.java、TextOutputer.java、SplitReader.java和TextStorageHandler.java四個Java程序。

    更多開發Java程序信息,請參見開發UDF

  2. 通過MaxCompute Studio的一鍵式打包功能,將TextStorageHandler.java打包上傳為MaxCompute資源。

    假設,此處打包的資源名稱為javatest-1.0-SNAPSHOT.jar。更多打包上傳信息,請參見打包、上傳及注冊

    說明

    如果有多個依賴請分別打包后上傳為MaxCompute資源。

  3. 執行如下命令創建OSS外部表。

    CREATE EXTERNAL TABLE [IF NOT EXISTS] ambulance_data_txt_external
    (
    vehicleId int,
    recordId int,
    patientId int,
    calls int,
    locationLatitute double,
    locationLongtitue double,
    recordTime string,
    direction string
    )
    stored BY 'com.aliyun.odps.udf.example.text.TextStorageHandler' 
      WITH serdeproperties (
    'delimiter'='|',  
    'odps.properties.rolearn'='acs:ram::xxxxxxxxxxxxx:role/aliyunodpsdefaultrole'
    )
    location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/oss-mc-test/SampleData/'
    USING 'javatest-1.0-SNAPSHOT.jar'; 

    其中delimiter是OSS數據的分隔符名稱。

    您可以執行desc extended ambulance_data_txt_external;命令查看創建好的外部表結構信息。

    說明

    對于自定義解析器,默認不會對數據分片,防止解析器出現正確性問題。如果您確認可以處理分片,需要使用如下命令允許進行數據分片,即啟動多個mapper。

    set odps.sql.unstructured.data.single.file.split.enabled=true;

示例:通過自定義解析器創建OSS外部表-非文本數據

示例:數據準備中的SpeechSentence/目錄建立映射關系。

操作流程如下:

  1. 使用MaxCompute Studio開發SpeechSentenceSnrExtractor.java、SpeechStorageHandler.java兩個Java程序。

    更多開發Java程序信息,請參見開發UDF

  2. 通過MaxCompute Studio的一鍵式打包功能,將SpeechStorageHandler.java打包上傳為MaxCompute資源。

    假設,此處打包的資源名稱為speechtest-1.0-SNAPSHOT.jar。更多打包上傳信息,請參見打包、上傳及注冊

  3. 執行如下命令創建OSS外部表。

    CREATE EXTERNAL TABLE [IF NOT EXISTS] speech_sentence_snr_external
    (
    sentence_snr double,
    id string
    )
    stored BY 'com.aliyun.odps.udf.example.speech.SpeechStorageHandler'
    WITH serdeproperties (
        'odps.properties.rolearn'='acs:ram::xxxxxxxxxxxxx:role/aliyunodpsdefaultrole',   
        'mlfFileName'='sm_random_5_utterance.text.label',
        'speechSampleRateInKHz' = '16'
    )
    location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/oss-mc-test/SpeechSentence/'
    USING 'speechtest-1.0-SNAPSHOT.jar,sm_random_5_utterance.text.label';

    您可以執行desc extended speech_sentence_snr_external;命令查看創建好的外部表結構信息。

示例:創建OSS外部表并指定對應OSS文件的第一行為表頭

--創建外部表
CREATE EXTERNAL TABLE mf_oss_wtt
(
  id bigint,
  name string,
  tran_amt double
)
STORED BY 'com.aliyun.odps.CsvStorageHandler'
WITH serdeproperties (
  'odps.text.option.header.lines.count' = '1',
  'odps.sql.text.option.flush.header' = 'true'
)
location 'oss://oss-cn-beijing-internal.aliyuncs.com/mfosscostfee/demo11/';

--插入數據
INSERT overwrite TABLE mf_oss_wtt VALUES (1, 'val1', 1.1),(2, 'value2', 1.3);
--查詢數據
--在建表的時候可以把所有字段建成string,否則表頭讀取時會報錯。
--或者在建表的時候需要加跳過表頭的參數:'odps.text.option.header.lines.count' = '1'
SELECT * FROM mf_oss_wtt;
+------------+------+------------+
| id         | name | tran_amt   |
+------------+------+------------+
| 1          | val1 | 1.1        |
| 2          | value2 | 1.3        |
+------------+------+------------+

打開外部表對應的OSS文件內容如下:oss外部表文件

示例:創建OSS外部表且外部表列數與OSS數據列數不一致

  1. 準備如下數據,保存為CSV格式上傳至OSS的doc-test-01/demo目錄下。

    1,kyle1,this is desc1
    2,kyle2,this is desc2,this is two
    3,kyle3,this is desc3,this is three, I have 4 columns
  2. 創建外部表。

    • 指定對于列數不一致行的處理方式為truncate

      --刪除表
      DROP TABLE test_mismatch;
      --新建外部表
      CREATE EXTERNAL TABLE IF NOT EXISTS test_mismatch
      (
        id string,
        name string,
        dect string,
        col4 string
      )
      stored BY 'com.aliyun.odps.CsvStorageHandler'
      WITH serdeproperties ('odps.sql.text.schema.mismatch.mode' = 'truncate')
      location 'oss://oss-cn-shanghai-internal.aliyuncs.com/doc-test-01/demo/';
    • 指定對于列數不一致行的處理方式為ignore

      --刪除表
      DROP TABLE test_mismatch01;
      --新建外部表
      CREATE EXTERNAL TABLE IF NOT EXISTS test_mismatch01
      (
        id string,
        name string,
        dect string,
        col4 string
      )
      stored BY 'com.aliyun.odps.CsvStorageHandler'
      WITH serdeproperties ('odps.sql.text.schema.mismatch.mode' = 'ignore')
      location 'oss://oss-cn-shanghai-internal.aliyuncs.com/doc-test-01/demo/';
  3. 查詢表數據。

    • SELECT * FROM test_mismatch;
      
      --返回結果
      +----+------+------+------+
      | id | name | dect | col4 |
      +----+------+------+------+
      | 1  | kyle1 | this is desc1 | NULL |
      | 2  | kyle2 | this is desc2 | this is two |
      | 3  | kyle3 | this is desc3 | this is three |
      +----+------+------+------+
    • SELECT * FROM test_mismatch01;
      
      --返回結果
      +----+------+------+------+
      | id | name | dect | col4 |
      +----+------+------+------+
      | 2  | kyle2 | this is desc2 | this is two |
      +----+------+------+------+

參考:語法參數說明

上述語法中各參數的含義如下。

參數名稱

可選/必填

說明

mc_oss_extable_name

必填

待創建的OSS外部表的名稱。

表名大小寫不敏感,在查詢外部表時,無需區分大小寫,且不支持強制轉換大小寫。

col_name

必填

OSS外部表的列名稱。

在讀取OSS數據場景,創建的OSS外部表結構必須與OSS數據文件結構保持一致,否則無法成功讀取OSS數據。

data_type

必填

OSS外部表的列數據類型。

在讀取OSS數據場景,創建的OSS外部表各列數據類型必須與OSS數據文件各列數據類型保持一致,否則無法成功讀取OSS數據。

partitioned by (<col_name> <data_type>, ...)

條件必填

當OSS中的數據文件是以分區路徑方式存儲時,需要攜帶該參數,創建分區表。

  • col_name:分區列名稱。

  • data_type:分區列數據類型。

StorageHandler

條件必填

當您使用內置文本數據解析器或自定義解析器創建OSS外部表時,需要攜帶該參數。MaxCompute解析器主要分為如下兩類:

  • 內置文本數據解析器:

    • com.aliyun.odps.CsvStorageHandler:讀寫CSV或以GZIP方式壓縮的CSV數據文件。

    • com.aliyun.odps.TsvStorageHandler:讀寫TSV或以GZIP方式壓縮的TSV數據文件。

  • 自定義解析器:您通過編寫MaxCompute UDF自定義的解析器。更多編寫MaxCompute UDF信息,請參見開發UDF

'<property_name>'='<property_value>'

必填

OSS外部表擴展屬性。詳細屬性列表,請參見參考:with serdeproperties屬性列表

oss_location

必填

數據文件所在OSS路徑。格式為oss://<oss_endpoint>/<Bucket名稱>/<OSS目錄名稱>/。MaxCompute默認會讀取該路徑下的所有數據文件。

  • oss_endpoint:OSS訪問域名信息。您需要使用OSS提供的經典網絡域名,否則將產生OSS流量費用。例如oss://oss-cn-beijing-internal.aliyuncs.com/xxx。更多OSS經典網絡域名信息,請參見訪問域名和數據中心

    說明

    建議數據文件存放的OSS地域與MaxCompute項目所在地域保持一致。由于MaxCompute只在部分地域部署,跨地域的數據連通性可能存在問題。

  • Bucket名稱:OSS存儲空間名稱,即Bucket名稱。更多查看存儲空間名稱信息,請參見列舉存儲空間

  • 目錄名稱:OSS目錄名稱。目錄后不需要指定文件名。

    --正確用法。
    oss://oss-cn-shanghai-internal.aliyuncs.com/oss-mc-test/Demo1/
    --錯誤用法。
    http://oss-cn-shanghai-internal.aliyuncs.com/oss-mc-test/Demo1/                -- 不支持HTTP連接。
    https://oss-cn-shanghai-internal.aliyuncs.com/oss-mc-test/Demo1/               -- 不支持HTTPS連接。
    oss://oss-cn-shanghai-internal.aliyuncs.com/Demo1                              -- 連接地址錯誤。
    oss://oss-cn-shanghai-internal.aliyuncs.com/oss-mc-test/Demo1/vehicle.csv     -- 不需要指定文件名。

jar_name

條件必填

當您使用自定義解析器創建OSS外部表時,需要攜帶該參數。指定自定義解析器代碼對應的JAR包。該JAR包需要添加為MaxCompute項目資源。

更多添加資源信息,請參見添加資源

serde_class

條件可選

指定MaxCompute內置的開源數據解析器。如果數據文件格式為TEXTFILE,必須攜帶該參數,其他場景可以不配置。

MaxCompute支持的開源數據格式對應的serde_class如下:

  • PARQUET:org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe

  • TEXTFILE:org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDeorg.apache.hive.hcatalog.data.JsonSerDeorg.apache.hadoop.hive.serde2.OpenCSVSerde

  • ORC:org.apache.hadoop.hive.ql.io.orc.OrcSerde

  • AVRO:org.apache.hadoop.hive.serde2.avro.AvroSerDe

  • SEQUENCEFILE:org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe

  • RCFILE:org.apache.hadoop.hive.serde2.columnar.LazyBinaryColumnarSerDe

  • ORCFILE:org.apache.hadoop.hive.ql.io.orc.OrcSerde

file_format

條件必填

當OSS數據文件為開源格式時,需要攜帶該參數,以指定OSS數據文件的格式。

說明

單個文件大小不能超過3 GB,如果文件過大,建議拆分。

resource_name

條件可選

當您使用自定義的serde class時,需要指定依賴的資源。資源中包含了自定義的serde class

serde class相關的JAR包需要添加為MaxCompute項目資源。

更多添加資源信息,請參見添加資源

'<tbproperty_name>'='<tbproperty_value>'

條件可選

OSS外部表擴展屬性。詳細屬性列表,請參見參考:tblproperties屬性列表

參考:with serdeproperties屬性列表

property_name

使用場景

說明

property_value

默認值

odps.properties.rolearn

使用STS模式授權時,請添加該屬性。

指定RAM中Role(具有訪問OSS權限)的ARN信息。

您可以通過RAM控制臺中的角色詳情獲取。

odps.text.option.gzip.input.enabled

當需要讀取以GZIP方式壓縮的CSV或TSV文件數據時,請添加該屬性。

CSV、TSV壓縮屬性。配置該參數值為True時,MaxCompute才可以正常讀取壓縮文件,否則會讀取失敗。

  • True

  • False

False

odps.text.option.gzip.output.enabled

當需要將數據以GZIP壓縮方式寫入OSS時,請添加該屬性。

CSV、TSV壓縮屬性。配置該參數值為True時,MaxCompute才能將數據以GZIP壓縮方式寫入OSS,否則不壓縮。

  • True

  • False

False

odps.text.option.header.lines.count

當OSS數據文件為CSV或TSV,且需要忽略OSS數據文件中的前N行時,請添加該屬性。

MaxCompute讀取OSS數據文件時,會忽略指定的行數。

非負整數

0

odps.text.option.null.indicator

當OSS數據文件為CSV或TSV,且需要定義OSS數據文件中NULL的解析規則時,請添加該屬性。

通過該參數配置的字符串會被解析為SQL中的NULL。例如\N指代NULL,則a,\N,b會解析為a, NULL, b

字符串

空字符串

odps.text.option.ignore.empty.lines

當OSS數據文件為CSV或TSV,且需要定義OSS數據文件中空行的處理規則時,請添加該屬性。

配置該參數值為True時,MaxCompute會忽略數據文件中的空行,否則會讀取空行。

  • True

  • False

True

odps.text.option.encoding

當OSS數據文件為CSV或TSV,且OSS數據文件編碼規則非默認編碼規則時,請添加該屬性。

確保此處配置的編碼規則與OSS數據文件編碼規則保持一致,否則MaxCompute無法成功讀取數據。

  • UTF-8

  • UTF-16

  • US-ASCII

  • GBK

UTF-8

odps.text.option.delimiter

當需要明確CSV或TSV數據文件的列分隔符時,請添加該屬性。

確保此處配置的列分隔符可以正確讀取OSS數據文件的每一列,否則MaxCompute讀取的數據會出現錯位問題。

單個字符

英文逗號(,)

odps.text.option.use.quote

當CSV或TSV數據文件中的字段包含換行(CRLF)、雙引號或英文逗號時,請添加該屬性。

當CSV某個字段中包含換行、雙引號(需要在"前再加"轉義)或英文逗號時,整個字段必須用雙引號("")括起來作為列分隔符。該參數指定是否識別CSV的列分隔符"

  • True

  • False

False

mcfed.parquet.compression

當需要將PARQUET數據以壓縮方式寫入OSS時,請添加該屬性。

PARQUET壓縮屬性。PARQUET數據默認不壓縮。

  • SNAPPY

  • GZIP

parquet.file.cache.size

在處理PARQUET數據場景,如果需要提升讀OSS數據文件性能,請添加該屬性。

指定讀OSS數據文件時,可緩存的數據量,單位為KB。

1024

parquet.io.buffer.size

在處理PARQUET數據場景,如果需要提升讀OSS數據文件性能,請添加該屬性。

指定OSS數據文件大小超過1024 KB時,可緩存的數據量,單位為KB。

4096

separatorChar

當需要明確以TEXTFILE格式保存的CSV數據的列分隔符時,請添加該屬性。

指定CSV數據列分隔符。

單個字符串

英文逗號(,)

quoteChar

當以TEXTFILE格式保存的CSV數據中的字段包含換行、雙引號或英文逗號時,請添加該屬性。

指定CSV數據的引用符。

單個字符串

escapeChar

當需要明確以TEXTFILE格式保存的CSV數據的轉義規則時,請添加該屬性。

指定CSV數據的轉義符。

單個字符串

mcfed.orc.schema.resolution

同一張OSS外部表中數據的Schema不一樣。

用于設置ORC文件解析方式,name表示根據列名解析。

name

默認按列號解析,等價于: 'mcfed.orc.schema.resolution'='position'

odps.sql.text.option.flush.header

在往OSS寫數據的時候,文件塊的第一行為表頭。

只有針對CSV文件格式生效。

  • True

  • False

False

odps.sql.text.schema.mismatch.mode

當讀取的OSS文件的數據列數和外部表的Schema列數不一致時。

指定對于列數不一致行的處理方式。

說明

odps.text.option.use.quote參數值為True時,該功能不生效。

  • error:報錯。

  • truncate:超過外部表列數部分數據被截斷;少于外部表列數部分數據則補null

  • ignore:丟棄不一致的行。

error

參考:tblproperties屬性列表

property_name

使用場景

說明

property_value

默認值

skip.header.line.count

當需要忽略以TEXTFILE格式保存的CSV文件中的前N行數據時,請添加該屬性。

MaxCompute讀取OSS數據時,會忽略從首行開始指定行數的數據。

非負整數

skip.footer.line.count

當需要忽略以TEXTFILE格式保存的CSV文件中的后N行數據時,請添加該屬性。

MaxCompute讀取OSS數據時,會忽略從尾行開始指定行數的數據。

非負整數

mcfed.orc.compress

當需要將ORC數據以壓縮方式寫入OSS時,請添加該屬性。

ORC壓縮屬性。指定ORC數據的壓縮方式。

  • SNAPPY

  • ZLIB

mcfed.mapreduce.output.fileoutputformat.compress

當需要將TEXTFILE數據文件以壓縮方式寫入OSS時,請添加該屬性。

TEXTFILE壓縮屬性。配置該參數值為True時,MaxCompute才可以將TEXTFILE數據文件以壓縮方式寫入OSS,否則不壓縮。

  • True

  • False

False

mcfed.mapreduce.output.fileoutputformat.compress.codec

當需要將TEXTFILE數據文件以壓縮方式寫入OSS時,請添加該屬性。

TEXTFILE壓縮屬性。設置TEXTFILE數據文件的壓縮方式。

說明

只支持property_value中的四種壓縮方式。

  • com.hadoop.compression.lzo.LzoCodec

  • com.hadoop.compression.lzo.LzopCodec

  • org.apache.hadoop.io.compress.SnappyCodec

  • com.aliyun.odps.io.compress.SnappyRawCodec

io.compression.codecs

當OSS數據文件為Raw-Snappy格式時,請添加該屬性。

配置該參數值為True時,MaxCompute才可以正常讀取壓縮數據,否則MaxCompute無法成功讀取數據。

com.aliyun.odps.io.compress.SnappyRawCodec

相關文檔

創建OSS外部表后,您可以通過外部表讀取存儲在OSS目錄中的數據文件。具體操作請參見讀取OSS數據