このトピックでは、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 が入力されます。
データの型のサポート
MaxCompute のデータの型の詳細については、「データの型 (バージョン 1.0)」および「データの型 (バージョン 2.0)」をご参照ください。
スマート解析の詳細については、「スマート解析によるより柔軟な型解析」をご参照ください。
データの型 | 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 は圧縮ファイルを読み取ることができます。それ以外の場合、読み取り操作は失敗します。 |
| False |
odps.text.option.gzip.output.enabled | GZIP 圧縮フォーマットで OSS にデータを書き込むには、このプロパティを追加します。 | CSV および TSV 圧縮プロパティ。このパラメーターを True に設定すると、MaxCompute は GZIP 圧縮フォーマットで OSS にデータを書き込むことができます。それ以外の場合、データは圧縮されません。 |
| 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 として解析されます。たとえば、 | 文字列 | 空の文字列 | |
odps.text.option.ignore.empty.lines | OSS 内の CSV または TSV データファイルで空の行がどのように処理されるかを定義するには、このプロパティを追加します。 | このパラメーターが True に設定されている場合、MaxCompute はデータファイル内の空の行を無視します。それ以外の場合、空の行は読み取られます。 |
| True | |
odps.text.option.encoding | OSS 内の CSV または TSV データファイルのエンコーディングがデフォルトのエンコーディングでない場合は、このプロパティを追加します。 | ここで指定されたエンコーディングが OSS データファイルのエンコーディングと一致することを確認してください。そうでない場合、MaxCompute はデータを読み取ることができません。 |
| UTF-8 | |
odps.text.option.delimiter | CSV または TSV データファイルの列区切り文字を指定するには、このプロパティを追加します。 | 指定された列区切り文字が OSS データファイルの各列を正しく読み取れることを確認してください。そうでない場合、MaxCompute によって読み取られたデータがずれる可能性があります。 | 単一の文字 | カンマ (,) | |
odps.text.option.use.quote | CSV または TSV データファイルのフィールドに改行 (CRLF)、二重引用符、またはカンマが含まれている場合は、このプロパティを追加します。 | CSV ファイルのフィールドに改行、二重引用符 (別の |
| False | |
odps.sql.text.option.flush.header | OSS にデータを書き込むとき、ファイルブロックの最初の行がヘッダーになります。 | このパラメーターは CSV ファイルに対してのみ有効です。 |
| False | |
odps.sql.text.schema.mismatch.mode | OSS ファイルのデータ列数が外部テーブルスキーマの列数と一致しない場合。 | 列数が一致しない行の処理方法を指定します。 注: この設定は、odps.text.option.use.quote パラメーターが True に設定されている場合は効果がありません。 |
| 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 に書き込むことができます。それ以外の場合、データは圧縮されません。 |
| False | |
mcfed.mapreduce.output.fileoutputformat.compress.codec | TEXTFILE データファイルを圧縮フォーマットで OSS に書き込むには、このプロパティを追加します。 | TEXTFILE 圧縮プロパティ。TEXTFILE データファイルの圧縮メソッドを設定します。 注: |
| なし | |
io.compression.codecs | OSS データファイルが Raw-Snappy フォーマットである場合は、このプロパティを追加します。 | このパラメーターを True に設定すると、MaxCompute は圧縮データを読み取ることができます。それ以外の場合、MaxCompute はデータを読み取ることができません。 | com.aliyun.odps.io.compress.SnappyRawCodec | なし |
データの書き込み
MaxCompute での書き込み構文の詳細については、「書き込み構文」をご参照ください。
クエリ分析
スマート解析によるより柔軟な型解析
MaxCompute SQL は、データの型 2.0 を使用して、CSV フォーマットの OSS 外部テーブルのデータの読み取りと書き込みを行います。これにより、以前は厳密なフォーマットの値のみがサポートされていたのに対し、CSV ファイル内のさまざまな値の型との互換性が提供されます。次の表で詳細を説明します。
型 | 文字列としての入力 | 文字列としての出力 | 説明 |
BOOLEAN |
説明 入力は、解析中に |
| 値が列挙にない場合、解析は失敗します。 |
TINYINT |
説明
|
| 8 ビット整数。値が |
SMALLINT | 16 ビット整数。値が | ||
INT | 32 ビット整数。値が | ||
BIGINT | 64 ビット整数。値が 説明
| ||
FLOAT |
説明
|
| 特殊な値 (大文字と小文字を区別しない) には、NaN、Inf、-Inf、Infinity、および -Infinity が含まれます。値が値の範囲外の場合、エラーが報告されます。精度を超えた場合、値は四捨五入されて切り捨てられます。 |
DOUBLE |
説明
|
| 特殊な値 (大文字と小文字を区別しない) には、NaN、Inf、-Inf、Infinity、および -Infinity が含まれます。値が値の範囲外の場合、エラーが報告されます。精度を超えた場合、値は四捨五入されて切り捨てられます。 |
DECIMAL (precision, scale) 例: DECIMAL(15,2) |
説明
|
| 整数部が 小数部がスケールを超えた場合、値は四捨五入されて切り捨てられます。 |
CHAR(n) 例: CHAR(7) |
|
| 最大長は 255 です。長さが n 未満の場合は、スペースでパディングされます。パディングスペースは比較では使用されません。長さが n を超える場合、文字列は切り捨てられます。 |
VARCHAR(n) 例: VARCHAR(7) |
|
| 最大長は 65535 です。長さが n を超える場合、文字列は切り捨てられます。 |
STRING |
|
| 長さの制限は 8 MB です。 |
DATE |
説明 入力の解析方法を |
|
|
TIMESTAMP_NTZ 説明 OpenCsvSerde は Hive データフォーマットと互換性がないため、この型をサポートしていません。 |
|
|
|
DATETIME |
| システムタイムゾーンが Asia/Shanghai の場合:
|
|
TIMESTAMP |
| システムタイムゾーンが Asia/Shanghai の場合:
|
|
注意
どのデータの型でも、CSV データファイル内の空の文字列は、テーブルに読み込まれるときに NULL として解析されます。
STRUCT、ARRAY、MAP などの複雑な型は、その値がカンマ (,) などの一般的な CSV デリミタと競合しやすく、解析が失敗する可能性があるため、サポートされていません。
BINARY および INTERVAL 型は現在サポートされていません。これらの型を使用するには、MaxCompute のテクニカルサポートにお問い合わせください。
INT、SMALLINT、TINYINT、BIGINT、FLOAT、DOUBLE、および DECIMAL データの型では、デフォルトの解析機能は柔軟です。
基本的な数値文字列のみを解析したい場合は、
tblpropertiesでodps.text.option.smart.parse.levelパラメーターをnaiveに設定できます。これにより、パーサーは "123" や "123.456" などの通常の数値文字列のみをサポートするように構成されます。他の文字列フォーマットを解析するとエラーになります。4 つの日付と時刻関連の型 (DATE、DATETIME、TIMESTAMP、および TIMESTAMP_NTZ) では、基盤となるコードは処理に
java.time.format.DateTimeFormatterを使用します。MaxCompute には、いくつかの組み込みのデフォルト解析フォーマットがあります。tblpropertiesでodps.text.option.<date|datetime|timestamp|timestamp_ntz>.io.formatを設定することで、複数の解析フォーマットと 1 つの出力フォーマットを定義することもできます。解析フォーマットはハッシュ記号 (#) で区切ることができます。カスタムフォーマットは、MaxCompute の組み込み解析フォーマットよりも優先度が高くなります。出力フォーマットは、最初のカスタムフォーマットを使用します。
たとえば、DATE 型のカスタムフォーマット文字列を
pattern1#pattern2#pattern3として定義した場合、pattern1、pattern2、または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: 非パーティションテーブル
テーブルをサンプルデータの
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 外部テーブルのスキーマを表示できます。非パーティション外部テーブルをクエリします。
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 | +------------+------------+------------+------------+------------------+-------------------+------------+----------------+非パーティション外部テーブルにデータを書き込み、データが書き込まれたかどうかを確認します。
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/パスに新しいファイルが生成されます。
例 2: パーティションテーブル
テーブルをサンプルデータの
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; コマンドを実行して、作成された外部テーブルのスキーマを表示できます。パーティションデータをインポートします。作成した 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');パーティション外部テーブルをクエリします。
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 | +------------+------------+------------+------------+------------------+-------------------+----------------+------------+パーティション外部テーブルにデータを書き込み、データが書き込まれたかどうかを確認します。
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パスに新しいファイルが生成されます。
例 3: 圧縮データ
この例では、GZIP 圧縮された CSV 外部テーブルを作成し、読み取りおよび書き込み操作を実行する方法を示します。
内部テーブルを作成し、テストデータを書き込みます。
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');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; コマンドを実行して、作成された外部テーブルのスキーマを表示できます。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 | +------------+------------+------------+内部テーブルからデータを読み取り、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 外部テーブルを作成する
サンプルデータから
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外部テーブルを作成します。
列数が一致しない行の動作を
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/';列数が一致しない行の動作を
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/';テーブルデータをクエリします。
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 外部テーブルを作成し、カンマ区切りファイルを読み取り、データの最初と最後の行を無視する方法を示します。
サンプルデータから
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外部テーブルを作成し、デリミタをカンマとして指定し、最初と最後の行を無視するようにパラメーターを設定します。
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" ) ;外部テーブルを読み取ります。
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 時刻型のカスタム解析および出力フォーマットの詳細については、「スマート解析によるより柔軟な型解析」をご参照ください。
さまざまな時刻データの型 (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');データを挿入すると、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データを再度読み取って結果を確認します。
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 | +------------+---------------------+---------------------+------------------------+