すべてのプロダクト
Search
ドキュメントセンター

MaxCompute:CSV/TSV 外部テーブル

最終更新日:Nov 09, 2025

このトピックでは、Object Storage Service (OSS) の CSV および TSV 外部テーブルを作成、読み取り、書き込みする方法について説明します。

前提条件

  • Alibaba Cloud アカウント、RAM ユーザー、または RAM ロールには、OSS 外部テーブルにアクセスするために必要な権限が必要です。権限付与の詳細については、「OSS の STS 権限付与」をご参照ください。

  • (オプション) OSS バケット、OSS ディレクトリ、および OSS データファイルを作成済みであること。詳細については、「バケットの作成」、「ディレクトリの管理」、および「簡易アップロード」をご参照ください。

    MaxCompute は OSS 内にディレクトリを自動的に作成できます。単一の SQL 文を使用して、外部テーブルと UDF の両方を含む読み取りおよび書き込み操作を実行できます。手動でのディレクトリ作成は不要になりましたが、従来のメソッドも引き続きサポートされています。
  • MaxCompute プロジェクトを作成済みであること。詳細については、「MaxCompute プロジェクトの作成」をご参照ください。

    MaxCompute は特定のリージョンにのみデプロイされます。リージョン間のデータ接続性の問題を回避するため、MaxCompute プロジェクトと同じリージョンにあるバケットを使用してください。
  • Alibaba Cloud アカウントまたは RAM ユーザーが、プロジェクトに対する CreateTable 権限を持っていること。テーブル操作の権限の詳細については、「MaxCompute の権限」をご参照ください。

制限事項

  • クラスタープロパティは OSS 外部テーブルではサポートされていません。

  • 単一のファイルは 3 GB を超えることはできません。ファイルが 3 GB より大きい場合は、分割する必要があります。

注意

CSV または TSV ファイルからデータを読み取る際に、ファイル内の列数と外部テーブルの DDL 文の列数が一致しない場合、エラーが報告されます。例: FAILED: ODPS-0123131:User defined function exception - Traceback:java.lang.RuntimeException: SCHEMA MISMATCH:xxx

この動作を制御するには、セッションレベルで odps.sql.text.schema.mismatch.mode パラメーターを設定します。

  • SET odps.sql.text.schema.mismatch.mode=error: 列数が一致しない場合、システムはエラーを報告します。

  • SET odps.sql.text.schema.mismatch.mode=truncate: 列数が一致しない場合、余分な列は破棄されます。ソースデータの列数がテーブル定義より少ない場合、不足している列には NULL が入力されます。

データの型のサポート

データの型

com.aliyun.odps.CsvStorageHandler/

TsvStorageHandler

(組み込みテキストデータパーサー)

org.apache.hadoop.hive.serde2.OpenCSVSerde

(組み込みオープンソースデータパーサー)

TINYINT

已开通

已开通

SMALLINT

已开通

已开通

INT

已开通

已开通

BIGINT

已开通

已开通

BINARY

未开通

未开通

FLOAT

已开通

已开通

DOUBLE

已开通

已开通

DECIMAL(precision,scale)

已开通

已开通

VARCHAR(n)

已开通

已开通

CHAR(n)

已开通

已开通

STRING

已开通

已开通

DATE

已开通

已开通

DATETIME

已开通

已开通

TIMESTAMP

已开通

已开通

TIMESTAMP_NTZ

已开通

未开通

BOOLEAN

已开通

已开通

ARRAY

未开通

未开通

MAP

未开通

未开通

STRUCT

未开通

未开通

JSON

未开通

未开通

圧縮フォーマットのサポート

圧縮された OSS ファイルの読み取りまたは書き込みを行う場合、CREATE TABLE 文に with serdeproperties プロパティを追加する必要があります。詳細については、「with serdeproperties パラメーター」をご参照ください。

圧縮フォーマット

com.aliyun.odps.CsvStorageHandler/

TsvStorageHandler

(組み込みテキストデータパーサー)

org.apache.hadoop.hive.serde2.OpenCSVSerde

(組み込みオープンソースデータパーサー)

GZIP

已开通

已开通

SNAPPY

未开通

已开通

LZO

未开通

已开通

外部テーブルの作成

構文

さまざまなフォーマットの外部テーブルを作成するための構文の詳細については、「OSS 外部テーブル」をご参照ください。

  • 組み込みテキストデータパーサー

    CSV フォーマット

    CREATE EXTERNAL TABLE [IF NOT EXISTS] <mc_oss_extable_name> 
    (
      <col_name> <data_type>,
      ...
    )
    [COMMENT <table_comment>]
    [PARTITIONED BY (<col_name> <data_type>, ...)] 
    STORED BY 'com.aliyun.odps.CsvStorageHandler'  
    [WITH serdeproperties (
      ['<property_name>'='<property_value>',...]
    )] 
    LOCATION '<oss_location>'
    [tblproperties ('<tbproperty_name>'='<tbproperty_value>',...)];

    TSV フォーマット

    CREATE EXTERNAL TABLE [IF NOT EXISTS] <mc_oss_extable_name> 
    (
      <col_name> <data_type>,
      ...
    )
    [COMMENT <table_comment>]
    [PARTITIONED BY (<col_name> <data_type>, ...)] 
    STORED BY 'com.aliyun.odps.TsvStorageHandler'  
    [WITH serdeproperties (
      ['<property_name>'='<property_value>',...]
    )] 
    LOCATION '<oss_location>'
    [tblproperties ('<tbproperty_name>'='<tbproperty_value>',...)];
  • 組み込みオープンソースデータパーサー

    CREATE EXTERNAL TABLE [IF NOT EXISTS] <mc_oss_extable_name>
    (
      <col_name> <data_type>,
      ...
    )
    [COMMENT <table_comment>]
    [PARTITIONED BY (<col_name> <data_type>, ...)]
    ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
    [WITH serdeproperties (
      ['<property_name>'='<property_value>',...]
    )]
    STORED AS TEXTFILE 
    LOCATION '<oss_location>' 
    [tblproperties ('<tbproperty_name>'='<tbproperty_value>',...)];

共通パラメーター

共通パラメーターの詳細については、「基本構文パラメーター」をご参照ください。

固有のパラメーター

with serdeproperties パラメーター

適用可能なパーサー

プロパティ名

シナリオ

説明

プロパティ値

デフォルト値

組み込みテキストデータパーサー (CsvStorageHandler/TsvStorageHandler)

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 データファイルの最初の N 行を無視するには、このプロパティを追加します。

MaxCompute が OSS からデータファイルを読み取るとき、指定された行数を無視します。

負でない整数

0

odps.text.option.null.indicator

OSS 内の CSV または TSV データファイルで NULL 値がどのように解析されるかを定義するには、このプロパティを追加します。

このパラメーターで指定された文字列は、SQL で NULL として解析されます。たとえば、\N が NULL を表す場合、a,\N,ba, NULL, b として解析されます。

文字列

空の文字列

odps.text.option.ignore.empty.lines

OSS 内の CSV または TSV データファイルで空の行がどのように処理されるかを定義するには、このプロパティを追加します。

このパラメーターが True に設定されている場合、MaxCompute はデータファイル内の空の行を無視します。それ以外の場合、空の行は読み取られます。

  • True

  • False

True

odps.text.option.encoding

OSS 内の CSV または TSV データファイルのエンコーディングがデフォルトのエンコーディングでない場合は、このプロパティを追加します。

ここで指定されたエンコーディングが 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

odps.sql.text.option.flush.header

OSS にデータを書き込むとき、ファイルブロックの最初の行がヘッダーになります。

このパラメーターは CSV ファイルに対してのみ有効です。

  • True

  • False

False

odps.sql.text.schema.mismatch.mode

OSS ファイルのデータ列数が外部テーブルスキーマの列数と一致しない場合。

列数が一致しない行の処理方法を指定します。

注: この設定は、odps.text.option.use.quote パラメーターが True に設定されている場合は効果がありません。

  • error: エラーを報告します。

  • truncate: 余分な列を破棄します。不足している列を null で埋めます。

  • ignore: 一貫性のない行を破棄します。

error

組み込みオープンソースデータパーサー (OpenCSVSerde)

separatorChar

TEXTFILE フォーマットで保存された CSV データの列区切り文字を指定するには、このプロパティを追加します。

CSV データの列区切り文字を指定します。

単一の文字列

カンマ (,)

quoteChar

TEXTFILE フォーマットで保存された CSV データのフィールドに改行、二重引用符、またはカンマが含まれている場合は、このプロパティを追加します。

CSV データの引用符文字を指定します。

単一の文字列

なし

escapeChar

TEXTFILE フォーマットで保存された CSV データのエスケープルールを指定するには、このプロパティを追加します。

CSV データのエスケープ文字を指定します。

単一の文字列

なし

tblproperties パラメーター

適用可能なパーサー

プロパティ名

シナリオ

説明

プロパティ値

デフォルト値

組み込みオープンソースデータパーサー (OpenCSVSerde)

skip.header.line.count

TEXTFILE フォーマットで保存された CSV ファイルの最初の N 行を無視するには、このプロパティを追加します。

MaxCompute が OSS からデータを読み取る際、最初の行から指定された行数を無視します。

負でない整数

なし

skip.footer.line.count

TEXTFILE フォーマットで保存された CSV ファイルの最後の N 行を無視するには、このプロパティを追加します。

MaxCompute が OSS からデータを読み取る際、最後の行から指定された行数を無視します。

負でない整数

なし

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 でサポートされている圧縮メソッドは 4 つのみです。

  • 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

なし

データの書き込み

MaxCompute での書き込み構文の詳細については、「書き込み構文」をご参照ください。

クエリ分析

  • SELECT 構文の詳細については、「クエリ構文」をご参照ください。

  • クエリプランの最適化の詳細については、「クエリの最適化」をご参照ください。

スマート解析によるより柔軟な型解析

MaxCompute SQL は、データの型 2.0 を使用して、CSV フォーマットの OSS 外部テーブルのデータの読み取りと書き込みを行います。これにより、以前は厳密なフォーマットの値のみがサポートされていたのに対し、CSV ファイル内のさまざまな値の型との互換性が提供されます。次の表で詳細を説明します。

文字列としての入力

文字列としての出力

説明

BOOLEAN

  • "true"/"false"

  • "T"/"F"

  • "1"/"0"

  • "Yes"/"No"

  • "Y"/"N"

  • "" (空の文字列は、テーブルに読み込まれるときに NULL として解析されます。)

説明

入力は、解析中に trim() 操作を使用してトリミングされます。

  • "true"/"false"

  • "true"/"false"

  • "true"/"false"

  • "true"/"false"

  • "true"/"false"

  • "" (NULL 値は空の文字列として CSV ファイルに出力されます。)

値が列挙にない場合、解析は失敗します。

TINYINT

  • "0"

  • "1"

  • "-100"

  • "1,234,567" (桁区切り記号表記。カンマは数値文字列の最初または最後の文字にすることはできません)

  • "1_234_567" (Java スタイル。アンダースコアは数値文字列の最初または最後の文字にすることはできません)

  • "0.3e2" (指数表記。実際の値が整数の場合は解析できます。それ以外の場合はエラーが報告されます。)

  • "-1e5" (指数表記)

  • "0xff" (16 進数、大文字と小文字を区別しない)

  • "0b1001" (バイナリ、大文字と小文字を区別しない)

  • "4/2" (分数。実際の値が整数の場合は解析できます。それ以外の場合はエラーが報告されます。)

  • "1000%" (パーセンテージ。実際の値が整数の場合は解析できます。それ以外の場合はエラーが報告されます。)

  • "1000‰" (パーミル。実際の値が整数の場合は解析できます。それ以外の場合はエラーが報告されます。)

  • "1,000 $" (通貨記号付き)

  • "$ 1,000" (通貨記号付き)

  • "3M" (K8s スタイル、1000 ベースの単位)

  • "2Gi" (K8s スタイル、1024 ベースの単位)

  • "" (空の文字列は、テーブルに読み込まれるときに NULL として解析されます。)

説明
  • 入力は、解析中に trim() 操作を使用してトリミングされます。

  • 「1,234,567」などの桁区切り記号表記を使用する場合は、CSV の区切り文字をカンマ以外の文字に手動で設定する必要があります。詳細については、「with serdeproperties パラメーター」の odps.text.option.delimiter の使用法をご参照ください。

  • K8s スタイルは、K、M、G、P、T などの 1000 ベースの単位と、Ki、Mi、Gi、Pi、Ti などの 1024 ベースの単位をサポートします。詳細については、「リソース管理」をご参照ください。

  • サポートされている通貨記号には $/¥/€/£/₩/USD/CNY/EUR/GBP/JPY/KRW/IDR/RP が含まれます。

  • "0""1""-100"、および "" は、ナイーブモードでも解析できます。

  • "0"

  • "1"

  • "-100"

  • "1234567"

  • "1234567"

  • "30"

  • "-100000"

  • "255"

  • "9"

  • "2"

  • "10"

  • "1"

  • "1000"

  • "1000"

  • "3000000" (1M = 1000 × 1000)

  • "2147483648" (1 Gi = 1024 × 1024 × 1024)

  • "" (NULL 値は空の文字列として CSV ファイルに出力されます。)

8 ビット整数。値が [-128, 127] の範囲外の場合、エラーが報告されます。

SMALLINT

16 ビット整数。値が [-32768, 32767] の範囲外の場合、エラーが報告されます。

INT

32 ビット整数。値が [-2147483648, 2147483647] の範囲外の場合、エラーが報告されます。

BIGINT

64 ビット整数。値が [-9223372036854775807, 9223372036854775807] の範囲外の場合、エラーが報告されます。

説明

-2<sup>63</sup> (つまり -9223372036854775808) は、SQL エンジンの制限により値の範囲内にありません。

FLOAT

  • "3.14"

  • "0.314e1" (指数表記)

  • "2/5" (分数)

  • "123.45%" (パーセンテージ)

  • "123.45‰" (パーミル)

  • "1,234,567.89" (桁区切り記号表記)

  • "1,234.56 $" (通貨記号付き)

  • "$ 1,234.56" (通貨記号付き)

  • "1.2M" (K8s スタイル、1000 ベースの単位)

  • "2Gi" (K8s スタイル、1024 ベースの単位)

  • "NaN" (大文字と小文字を区別しない)

  • "Inf" (大文字と小文字を区別しない)

  • "-Inf" (大文字と小文字を区別しない)

  • "Infinity" (大文字と小文字を区別しない)

  • "-Infinity" (大文字と小文字を区別しない)

  • "" (空の文字列は、テーブルに読み込まれるときに NULL として解析されます。)

説明
  • 入力は、解析中に trim() 操作を使用してトリミングされます。

  • "3.14""0.314e1""NaN""Infinity""-Infinity"、および "" は、ナイーブモードでも解析できます。

  • "3.14"

  • "3.14"

  • "0.4"

  • "1.2345"

  • "0.12345"

  • "1234567.89"

  • "1234.56"

  • "1234.56"

  • "1200000"

  • "2147483648"

  • "NaN"

  • "Infinity"

  • "-Infinity"

  • "Infinity"

  • "-Infinity"

  • "" (NULL 値は空の文字列として CSV ファイルに出力されます。)

特殊な値 (大文字と小文字を区別しない) には、NaN、Inf、-Inf、Infinity、および -Infinity が含まれます。値が値の範囲外の場合、エラーが報告されます。精度を超えた場合、値は四捨五入されて切り捨てられます。

DOUBLE

  • "3.1415926"

  • "0.314e1" (指数表記)

  • "2/5" (分数)

  • "123.45%" (パーセンテージ)

  • "123.45‰" (パーミル)

  • "1,234,567.89" (桁区切り記号表記)

  • "1,234.56 $" (通貨記号付き)

  • "$ 1,234.56" (通貨記号付き)

  • "1.2M" (K8s スタイル、1000 ベースの単位)

  • "2Gi" (K8s スタイル、1024 ベースの単位)

  • "NaN" (大文字と小文字を区別しない)

  • "Inf" (大文字と小文字を区別しない)

  • "-Inf" (大文字と小文字を区別しない)

  • "Infinity" (大文字と小文字を区別しない)

  • "-Infinity" (大文字と小文字を区別しない)

  • "" (空の文字列は、テーブルに読み込まれるときに NULL として解析されます。)

説明
  • 入力は、解析中に trim() 操作を使用してトリミングされます。

  • "3.1415926""0.314e1""NaN""Infinity""-Infinity"、および "" は、ナイーブモードでも解析できます。

  • "3.1415926"

  • "3.14"

  • "0.4"

  • "1.2345"

  • "0.12345"

  • "1234567.89"

  • "1234.56"

  • "1234.56"

  • "1200000"

  • "2147483648"

  • "NaN"

  • "Infinity"

  • "-Infinity"

  • "Infinity"

  • "-Infinity"

  • "" (NULL 値は空の文字列として CSV ファイルに出力されます。)

特殊な値 (大文字と小文字を区別しない) には、NaN、Inf、-Inf、Infinity、および -Infinity が含まれます。値が値の範囲外の場合、エラーが報告されます。精度を超えた場合、値は四捨五入されて切り捨てられます。

DECIMAL

(precision, scale)

例: DECIMAL(15,2)

  • "3.358"

  • "2/5" (分数)

  • "123.45%" (パーセンテージ)

  • "123.45‰" (パーミル)

  • "1,234,567.89" (桁区切り記号表記)

  • "1,234.56 $" (通貨記号付き)

  • "$ 1,234.56" (通貨記号付き)

  • "1.2M" (K8s スタイル、1000 ベースの単位)

  • "2Gi" (K8s スタイル、1024 ベースの単位)

  • "" (空の文字列は、テーブルに読み込まれるときに NULL として解析されます。)

説明
  • 入力は、解析中に trim() 操作を使用してトリミングされます。

  • "3.358" および "" は、ナイーブモードでも解析できます。

  • "3.36" (四捨五入)

  • "0.4"

  • "1.23" (四捨五入)

  • "0.12" (四捨五入)

  • "1234567.89"

  • "1234.56"

  • "1234.56"

  • "1200000"

  • "2147483648"

  • "" (NULL 値は空の文字列として CSV ファイルに出力されます。)

整数部が precision-scale を超えるとエラーが報告されます。

小数部がスケールを超えた場合、値は四捨五入されて切り捨てられます。

CHAR(n)

例: CHAR(7)

  • "abcdefg"

  • "abcdefghijklmn"

  • "abc"

  • "" (空の文字列は、テーブルに読み込まれるときに NULL として解析されます。)

  • "abcdefg"

  • "abcdefg" (残りは切り捨てられます。)

  • "abc____" (文字列「abc」の後には 4 つのスペースが続き、_ 文字で表されます。)

  • "" (NULL 値は空の文字列として CSV ファイルに出力されます。)

最大長は 255 です。長さが n 未満の場合は、スペースでパディングされます。パディングスペースは比較では使用されません。長さが n を超える場合、文字列は切り捨てられます。

VARCHAR(n)

例: VARCHAR(7)

  • "abcdefg"

  • "abcdefghijklmn"

  • "abc"

  • "" (空の文字列は、テーブルに読み込まれるときに NULL として解析されます。)

  • "abcdefg"

  • "abcdefg" (残りは切り捨てられます。)

  • "abc"

  • "" (NULL 値は空の文字列として CSV ファイルに出力されます。)

最大長は 65535 です。長さが n を超える場合、文字列は切り捨てられます。

STRING

  • "abcdefg"

  • "abc"

  • "" (空の文字列は、テーブルに読み込まれるときに NULL として解析されます。)

  • "abcdefg"

  • "abc"

  • "" (NULL 値は空の文字列として CSV ファイルに出力されます。)

長さの制限は 8 MB です。

DATE

  • "yyyy-MM-dd" (例: "2025-02-21")

  • "yyyyMMdd" (例: "20250221")

  • "MMM d,yyyy" (例: "October 1,2025")

  • "MMMM d,yyyy" (例: "Oct 1,2025")

  • "MMMM d, yyyy" (例: "October 1, 2025")

  • "" (空の文字列は、テーブルに読み込まれるときに NULL として解析されます。)

説明

入力の解析方法を odps.text.option.date.io.format を設定してカスタマイズすることもできます。たとえば、フォーマットを 'dd/MM/yyyy#yyyy--MM--dd' に設定すると、'21/02/2025''2025--02--21' を解析できます。

  • "2000-01-01"

  • "2000-01-01"

  • "" (NULL 値は空の文字列として CSV ファイルに出力されます。)

  • 時、分、秒の情報はありません。タイムゾーンを変更しても出力には影響しません。デフォルトの出力フォーマットは "yyyy-MM-dd" です。

  • odps.text.option.date.io.format を設定することで、解析と出力のフォーマットをカスタマイズすることもできます。出力フォーマットは最初のカスタムパターンを使用します。フォーマットの詳細については、「DateTimeFormatter」をご参照ください

TIMESTAMP_NTZ

説明

OpenCsvSerde は Hive データフォーマットと互換性がないため、この型をサポートしていません。

  • ナノ秒部分の長さは 0 から 9 です。MaxCompute は、次の組み込み解析フォーマットをサポートしています。

    • "yyyy-MM-dd HH:mm:ss[.SSSSSSSSS]" (例: "2000-01-01 00:00:00.123")

    • "yyyy-MM-ddTHH:mm:ss[.SSSSSSSSS]" (例: "2000-01-01T00:00:00.123456789")

    • "yyyyMMddHHmmss" (例: "20000101000000")

    • "" (空の文字列は、テーブルに読み込まれるときに NULL として解析されます。)

  • 入力の解析方法を odps.text.option.timestamp_ntz.io.format を設定してカスタマイズすることもできます。たとえば、フォーマットを 'ddMMyyyy-HHmmss' に設定すると、'31102024-103055' のような文字列を解析できます。

  • "2000-01-01 00:00:00.123000000"

  • "2000-01-01 00:00:00.123456789"

  • "2000-01-01 00:00:00.000000000"

  • "" (NULL 値は空の文字列として CSV ファイルに出力されます。)

  • これはナノ秒粒度のタイムスタンプです。タイムゾーンを変更しても出力には影響しません。デフォルトでは、出力は標準の UTC タイムゾーンとフォーマット "yyyy-MM-dd HH:mm:ss.SSSSSSSSS" を使用します。

  • 解析と出力のフォーマットを odps.text.option.timestamp_ntz.io.format を設定してカスタマイズすることもできます。フォーマットの詳細については、「DateTimeFormatter」をご参照ください

DATETIME

  • ミリ秒部分の長さは 0 から 3 です。`x` はタイムゾーンオフセットを表します。システムタイムゾーンが Asia/Shanghai の場合、MaxCompute は次の組み込み解析フォーマットをサポートします。

    • "yyyy-MM-dd HH:mm:ss[.SSS][x]" (例: "2000-01-01 00:00:00.123")

    • "yyyy-MM-ddTHH:mm:ss[.SSS][x]" (例: "2000-01-01T00:00:00.123+0000")

    • "yyyyMMddHHmmss[x]" (例: "20000101000000+0000")

    • "" (空の文字列は、テーブルに読み込まれるときに NULL として解析されます。)

  • 入力の解析方法を odps.text.option.datetime.io.format を設定してカスタマイズすることもできます。たとえば、フォーマットを 'yyyyMMdd-HHmmss.SSS' に設定すると、'20241031-103055.123' のような文字列を解析できます。

システムタイムゾーンが Asia/Shanghai の場合:

  • "2000-01-01 00:00:00.123+0800"

  • "2000-01-01 08:00:00.123+0800"

  • "2000-01-01 08:00:00.000+0800"

  • "" (NULL 値は空の文字列として CSV ファイルに出力されます。)

  • これはミリ秒粒度のタイムスタンプです。タイムゾーンを変更すると出力に影響します。デフォルトの出力フォーマットは "yyyy-MM-dd HH:mm:ss.SSSx" です。

  • odps.sql.timezone を使用してシステムタイムゾーンを変更し、出力値のタイムゾーンオフセットを制御できます。

  • 解析と出力のフォーマットを odps.text.option.datetime.io.format を設定してカスタマイズすることもできます。フォーマットの詳細については、「DateTimeFormatter」をご参照ください

TIMESTAMP

  • ナノ秒部分の長さは 0 から 9 です。`x` はタイムゾーンオフセットを表します。システムタイムゾーンが Asia/Shanghai の場合、MaxCompute は次の組み込み解析フォーマットをサポートします。

    • "yyyy-MM-dd HH:mm:ss[.SSSSSSSSS][x]" (例: "2000-01-01 00:00:00.123456")

    • "yyyy-MM-ddTHH:mm:ss[.SSSSSSSSS][x]" (例: "2000-01-01T00:00:00.123+0000")

    • "yyyyMMddHHmmss[x]" (例: "20000101000000+0000")

    • "" (空の文字列は、テーブルに読み込まれるときに NULL として解析されます。)

  • 入力の解析方法を odps.text.option.timestamp.io.format を設定してカスタマイズすることもできます。たとえば、フォーマットを 'yyyyMMdd-HHmmss' に設定すると、'20240910-103055' のような文字列を解析できます。

システムタイムゾーンが Asia/Shanghai の場合:

  • "2000-01-01 00:00:00.123456000+0800"

  • "2000-01-01 08:00:00.123000000+0800"

  • "2000-01-01 08:00:00.000000000+0800"

  • "" (NULL 値は空の文字列として CSV ファイルに出力されます。)

  • これはナノ秒粒度のタイムスタンプです。タイムゾーンを変更すると出力に影響します。デフォルトの出力フォーマットは "yyyy-MM-dd HH:mm:ss.SSSSSSSSSx" です。

  • odps.sql.timezone を使用してシステムタイムゾーンを変更し、出力値のタイムゾーンオフセットを制御できます。

  • 解析と出力のフォーマットを odps.text.option.timestamp.io.format を設定してカスタマイズすることもできます。フォーマットの詳細については、「DateTimeFormatter」をご参照ください

注意

  • どのデータの型でも、CSV データファイル内の空の文字列は、テーブルに読み込まれるときに NULL として解析されます。

  • STRUCT、ARRAY、MAP などの複雑な型は、その値がカンマ (,) などの一般的な CSV デリミタと競合しやすく、解析が失敗する可能性があるため、サポートされていません。

  • BINARY および INTERVAL 型は現在サポートされていません。これらの型を使用するには、MaxCompute のテクニカルサポートにお問い合わせください。

  • INT、SMALLINT、TINYINT、BIGINT、FLOAT、DOUBLE、および DECIMAL データの型では、デフォルトの解析機能は柔軟です。

    基本的な数値文字列のみを解析したい場合は、tblpropertiesodps.text.option.smart.parse.level パラメーターを naive に設定できます。これにより、パーサーは "123" や "123.456" などの通常の数値文字列のみをサポートするように構成されます。他の文字列フォーマットを解析するとエラーになります。

  • 4 つの日付と時刻関連の型 (DATE、DATETIME、TIMESTAMP、および TIMESTAMP_NTZ) では、基盤となるコードは処理に java.time.format.DateTimeFormatter を使用します。MaxCompute には、いくつかの組み込みのデフォルト解析フォーマットがあります。tblpropertiesodps.text.option.<date|datetime|timestamp|timestamp_ntz>.io.format を設定することで、複数の解析フォーマットと 1 つの出力フォーマットを定義することもできます。解析フォーマットはハッシュ記号 (#) で区切ることができます。

    • カスタムフォーマットは、MaxCompute の組み込み解析フォーマットよりも優先度が高くなります。出力フォーマットは、最初のカスタムフォーマットを使用します。

      たとえば、DATE 型のカスタムフォーマット文字列を pattern1#pattern2#pattern3 として定義した場合、pattern1pattern2、または pattern3 に一致する文字列を解析できます。ただし、ファイルにデータを書き込む場合、出力は pattern1 フォーマットを使用します。詳細については、「DateTimeFormatter」をご参照ください。

    • 特に中国のユーザーは、'z' (タイムゾーン名) は一部のコンテキストであいまいになる可能性があるため、カスタムタイムゾーンフォーマットとして使用しないでください。

      たとえば、中国では 'CST' は通常、中国標準時 (UTC+8) を意味します。しかし、'CST' が java.time.format.DateTimeFormatter によって解析されると、米国中部標準時 (UTC-6) として識別されます。これにより、予期しない入力または出力が発生する可能性があります。代わりに 'x' (ゾーンオフセット) または 'VV' (タイムゾーン ID) パターンを使用してください。

説明
  • 次のサンプルコードを実行するときは、<uid> をご使用の Alibaba Cloud アカウント ID に置き換えてください。

  • 次の例で使用されるロールは aliyunodpsdefaultrole です。別のロールを使用する場合は、aliyunodpsdefaultrole をターゲットロールの名前に置き換え、ターゲットロールに OSS へのアクセス権限を付与してください。

組み込みテキストデータパーサーを使用した OSS 外部テーブルの作成

例 1: 非パーティションテーブル

  1. テーブルをサンプルデータDemo1/ フォルダにマッピングします。次のサンプルコードは、OSS 外部テーブルを作成する方法を示しています。

    CREATE EXTERNAL TABLE IF NOT EXISTS mc_oss_csv_external1
    (
      vehicleId INT,
      recordId INT,
      patientId INT,
      calls INT,
      locationLatitute DOUBLE,
      locationLongitude DOUBLE,
      recordTime STRING,
      direction STRING
    )
    STORED BY 'com.aliyun.odps.CsvStorageHandler' 
    WITH serdeproperties (
      'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole'
    ) 
    LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/oss-mc-test/Demo1/';
    
    -- desc extended mc_oss_csv_external1; コマンドを実行して、作成された OSS 外部テーブルのスキーマを表示できます。
  2. 非パーティション外部テーブルをクエリします。

    SELECT * FROM mc_oss_csv_external1;

    次の結果が返されます。

    +------------+------------+------------+------------+------------------+-------------------+----------------+------------+
    | vehicleid  | recordid   | patientid  | calls      | locationlatitute | locationlongitude | recordtime     | direction  |
    +------------+------------+------------+------------+------------------+-------------------+----------------+------------+
    | 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          |
    +------------+------------+------------+------------+------------------+-------------------+------------+----------------+
  3. 非パーティション外部テーブルにデータを書き込み、データが書き込まれたかどうかを確認します。

    INSERT INTO mc_oss_csv_external1 VALUES(1,12,76,1,46.81006,-92.08174,'9/14/2014 0:10','SW');
    SELECT * FROM mc_oss_csv_external1 WHERE recordId=12;

    次の結果が返されます。

    +------------+------------+------------+------------+------------------+-------------------+----------------+------------+
    | vehicleid  | recordid   | patientid  | calls      | locationlatitute | locationlongitude | recordtime     | direction  |
    +------------+------------+------------+------------+------------------+-------------------+----------------+------------+
    | 1          | 12         | 76         | 1          | 46.81006         | -92.08174         | 9/14/2014 0:10 | SW         |
    +------------+------------+------------+------------+------------------+-------------------+----------------+------------+

    OSS の Demo1/ パスに新しいファイルが生成されます。image

例 2: パーティションテーブル

  1. テーブルをサンプルデータDemo2/ フォルダにマッピングします。次のサンプルコードは、OSS 外部テーブルを作成し、パーティションデータをインポートする方法を示しています。

    CREATE EXTERNAL TABLE IF NOT EXISTS mc_oss_csv_external2
    (
      vehicleId INT,
      recordId INT,
      patientId INT,
      calls INT,
      locationLatitute DOUBLE,
      locationLongitude DOUBLE,
      recordTime STRING
    )
    PARTITIONED BY (
      direction STRING
    )
    STORED BY 'com.aliyun.odps.CsvStorageHandler' 
    WITH serdeproperties (
      'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole'
    ) 
    LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/oss-mc-test/Demo2/';
    
    -- DESC EXTENDED mc_oss_csv_external2; コマンドを実行して、作成された外部テーブルのスキーマを表示できます。
  2. パーティションデータをインポートします。作成した OSS 外部テーブルがパーティションテーブルである場合は、パーティションデータもインポートする必要があります。詳細については、「OSS 外部テーブルにパーティションデータを追加するための構文」をご参照ください。

    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');
  3. パーティション外部テーブルをクエリします。

    SELECT * FROM mc_oss_csv_external2 WHERE direction='NE';

    次の結果が返されます。

    +------------+------------+------------+------------+------------------+-------------------+----------------+------------+
    | vehicleid  | recordid   | patientid  | calls      | locationlatitute | locationlongitude | recordtime     | direction  |
    +------------+------------+------------+------------+------------------+-------------------+----------------+------------+
    | 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          | 9          | 4          | 1          | 46.81006         | -92.08174         | 9/15/2014 0:00 | NE         |
    +------------+------------+------------+------------+------------------+-------------------+----------------+------------+
  4. パーティション外部テーブルにデータを書き込み、データが書き込まれたかどうかを確認します。

    INSERT INTO mc_oss_csv_external2 PARTITION(direction='NE') VALUES(1,12,76,1,46.81006,-92.08174,'9/14/2014 0:10');
    SELECT * FROM mc_oss_csv_external2 WHERE direction='NE' AND recordId=12;

    次の結果が返されます。

    +------------+------------+------------+------------+------------------+-------------------+----------------+------------+
    | vehicleid  | recordid   | patientid  | calls      | locationlatitute | locationlongitude | recordtime     | direction  |
    +------------+------------+------------+------------+------------------+-------------------+----------------+------------+
    | 1          | 12         | 76         | 1          | 46.81006         | -92.08174         | 9/14/2014 0:10 | NE         |
    +------------+------------+------------+------------+------------------+-------------------+----------------+------------+

    OSS の Demo2/direction=NE パスに新しいファイルが生成されます。image

例 3: 圧縮データ

この例では、GZIP 圧縮された CSV 外部テーブルを作成し、読み取りおよび書き込み操作を実行する方法を示します。

  1. 内部テーブルを作成し、テストデータを書き込みます。

    CREATE TABLE vehicle_test(
      vehicleid INT, 
      recordid INT, 
      patientid INT, 
      calls INT, 
      locationlatitute DOUBLE, 
      locationLongitude DOUBLE, 
      recordtime STRING, 
      direction STRING
    );
    
    INSERT INTO vehicle_test VALUES (1,1,51,1,46.81006,-92.08174,'9/14/2014 0:00','S');
  2. GZIP 圧縮された CSV 外部テーブルを作成し、サンプルデータDemo3/ (圧縮データ) フォルダにマッピングします。次のサンプル文は、OSS 外部テーブルを作成するために使用されます。

    CREATE EXTERNAL TABLE IF NOT EXISTS mc_oss_csv_external3
    (
      vehicleId INT,
      recordId INT,
      patientId INT,
      calls INT,
      locationLatitute DOUBLE,
      locationLongitude DOUBLE,
      recordTime STRING,
      direction STRING
    )
    PARTITIONED BY (dt STRING)
    STORED BY 'com.aliyun.odps.CsvStorageHandler' 
    WITH serdeproperties (
      'odps.properties.rolearn'='acs:ram::<uid>: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/';
    
    -- パーティションデータをインポートします。
    MSCK REPAIR TABLE mc_oss_csv_external3 ADD PARTITIONS;
    
    -- DESC EXTENDED mc_oss_csv_external3; コマンドを実行して、作成された外部テーブルのスキーマを表示できます。
  3. MaxCompute クライアントを使用して OSS からデータを読み取ります。以下はサンプルコマンドです。

    説明

    OSS の圧縮データがオープンソースデータフォーマットである場合は、SQL 文の前に set odps.sql.hive.compatible=true; コマンドを追加して、それらを一緒に送信する必要があります。

    --全表スキャンを有効にします。この設定は現在のセッションでのみ有効です。
    SET odps.sql.allow.fullscan=true;
    SELECT recordId, patientId, direction FROM mc_oss_csv_external3 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          |
    +------------+------------+------------+
  4. 内部テーブルからデータを読み取り、OSS 外部テーブルに書き込みます。

    MaxCompute クライアントを使用して外部テーブルで INSERT OVERWRITE または INSERT INTO コマンドを実行し、OSS にデータを書き込むことができます。

    INSERT INTO TABLE mc_oss_csv_external3 PARTITION (dt='20250418') SELECT * FROM vehicle_test;

    コマンドが正常に実行された後、エクスポートされたファイルを OSS フォルダで表示できます。

OSS 外部テーブルを作成し、対応する OSS ファイルの最初の行をヘッダーとして指定する

サンプルデータから oss-mc-test バケットに Demo11 フォルダを作成し、次の文を実行します。

--外部テーブルを作成します。
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-hangzhou-internal.aliyuncs.com/oss-mc-test/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 外部テーブルを作成する

  1. サンプルデータから oss-mc-test バケットに demo フォルダを作成し、test.csv ファイルをアップロードします。test.csv ファイルには次の内容が含まれています。

    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. 外部テーブルを作成します。

    1. 列数が一致しない行の動作を 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-hangzhou-internal.aliyuncs.com/oss-mc-test/demo/';
    2. 列数が一致しない行の動作を 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-hangzhou-internal.aliyuncs.com/oss-mc-test/demo/';
    3. テーブルデータをクエリします。

      • test_mismatch テーブルをクエリします。

        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 |
        +----+-------+---------------+---------------+
      • test_mismatch01 テーブルをクエリします。

        SELECT * FROM test_mismatch01;
        
        --結果
        +----+-------+----------------+-------------+
        | id | name  | dect           | col4        |
        +----+-------+----------------+-------------+
        | 2  | kyle2 | this is desc2  | this is two  
        +----+-------+----------------+-------------+

組み込みオープンソースパーサーを使用して OSS 外部テーブルを作成する

この例では、組み込みオープンソースパーサーを使用して OSS 外部テーブルを作成し、カンマ区切りファイルを読み取り、データの最初と最後の行を無視する方法を示します。

  1. サンプルデータから oss-mc-test バケットに demo-test フォルダを作成し、テストファイル test.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
  2. 外部テーブルを作成し、デリミタをカンマとして指定し、最初と最後の行を無視するようにパラメーターを設定します。

    CREATE EXTERNAL TABLE ext_csv_test08
    (
      vehicleId INT,
      recordId INT,
      patientId INT,
      calls INT,
      locationLatitute DOUBLE,
      locationLongitude DOUBLE,
      recordTime STRING,
      direction STRING
    )
    ROW FORMAT serde 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
    WITH serdeproperties (
    "separatorChar" = ","
    )
    stored AS textfile
    location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/***/'
    -- 最初と最後の行を無視するようにパラメーターを設定します。
    TBLPROPERTIES (
    "skip.header.line.COUNT"="1",
    "skip.footer.line.COUNT"="1"
    )
    ;
  3. 外部テーブルを読み取ります。

    SELECT * FROM ext_csv_test08;
    
    -- 結果は、最初と最後の行を無視して 8 行のみが読み取られたことを示しています。
    +------------+------------+------------+------------+------------------+-------------------+------------+------------+
    | vehicleid  | recordid   | patientid  | calls      | locationlatitute | locationlongitude | recordtime | direction  | 
    +------------+------------+------------+------------+------------------+-------------------+------------+------------+
    | 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          | 
    +------------+------------+------------+------------+------------------+-------------------+------------+------------+

カスタムの日付と時刻のデータの型を持つ CSV フォーマットの OSS 外部テーブルを作成する

CSV 時刻型のカスタム解析および出力フォーマットの詳細については、「スマート解析によるより柔軟な型解析」をご参照ください。

  1. さまざまな時刻データの型 (datetime、timestamp、および timestamp_ntz) の CSV 外部テーブルを作成します。

    CREATE EXTERNAL TABLE test_csv
    (
      col_date DATE,
      col_datetime DATETIME,
      col_timestamp TIMESTAMP,
      col_timestamp_ntz TIMESTAMP_NTZ
    )
    STORED BY 'com.aliyun.odps.CsvStorageHandler'
    LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/oss-mc-test/demo/'
    TBLPROPERTIES (
      'odps.text.option.date.io.format' = 'MM/dd/yyyy',
      'odps.text.option.datetime.io.format' = 'yyyy-MM-dd-HH-mm-ss x',
      'odps.text.option.timestamp.io.format' = 'yyyy-MM-dd HH-mm-ss VV',
      'odps.text.option.timestamp_ntz.io.format' = 'yyyy-MM-dd HH:mm:ss.SS'
    );
    
    INSERT OVERWRITE test_csv 
      VALUES(DATE'2025-02-21', DATETIME'2025-02-21 08:30:00', TIMESTAMP'2025-02-21 12:30:00', TIMESTAMP_NTZ'2025-02-21 16:30:00.123456789');
  2. データを挿入すると、CSV ファイルの内容は次のようになります。

    02/21/2025,2025-02-21-08-30-00 +08,2025-02-21 12-30-00 Asia/Shanghai,2025-02-21 16:30:00.12
  3. データを再度読み取って結果を確認します。

    SELECT * FROM test_csv;

    次の結果が返されます。

    +------------+---------------------+---------------------+------------------------+
    | col_date   | col_datetime        | col_timestamp       | col_timestamp_ntz      |
    +------------+---------------------+---------------------+------------------------+
    | 2025-02-21 | 2025-02-21 08:30:00 | 2025-02-21 12:30:00 | 2025-02-21 16:30:00.12 |
    +------------+---------------------+---------------------+------------------------+