使用に関する注意事項
このトピックには、CREATE EXTERNAL TABLE の使用上の注意事項が含まれています。PG_TABLE_DEF、STV_TBL_PERM、PG_CLASS、または information_schema など、標準の Amazon Redshift テーブルに使用したものと同じリソースを使用して Amazon Redshift Spectrum テーブルの詳細を表示することはできません。ビジネスインテリジェンスまたは分析ツールが Redshift Spectrum 外部テーブルを認識しない場合は、SVV_EXTERNAL_TABLESおよび SVV_EXTERNAL_COLUMNS にクエリを実行するようにアプリケーションを設定します。
CREATE EXTERNAL TABLE AS
一部のケースでは、AWS Glueデータカタログ、AWS Lake Formation外部カタログ、または Apache Hive メタストアに対して、CREATE EXTERNAL TABLE AS コマンドを実行します。このような場合は、AWS Identity and Access Management(IAM) ロールを使用して外部スキーマを作成します。この IAM ロールには、Amazon S3 に対する読み込みと書き込みの両方のアクセス許可が必要です。
Lake Formation カタログを使用する場合、IAM ロールにはカタログにテーブルを作成するアクセス許可が必要です。この場合、ターゲット Amazon S3 パスに対するデータレイクの場所のアクセス許可が必要です。この IAM ロールは新しい AWS Lake Formation テーブルの所有者になります。
ファイル名が必ず一意になるように、Amazon Redshift ではデフォルトで、Amazon S3 にアップロードされる各ファイルの名前に以下の形式が使用されます。
.<date>
_<time>
_<microseconds>
_<query_id>
_<slice-number>
_part_<part-number>
.<format>
例は 20200303_004509_810669_1007_0001_part_00.parquet
です。
CREATE EXTERNAL TABLE AS コマンドを実行するときは、以下の点を考慮してください。
-
Amazon S3 の場所は空であることが必要です。
-
Amazon Redshift では、STORED AS 句を使用する場合、PARQUET および TEXTFILE 形式のみがサポートされます。
-
列定義リストを定義する必要はありません。新しい外部テーブルの列の名前とデータ型は、SELECT クエリから直接派生します。
-
PARTITIONED BY 句でパーティション列のデータ型を定義する必要はありません。パーティションキーを指定する場合、この列の名前が SELECT クエリの結果にあることが必要です。複数のパーティション列がある場合、SELECT クエリでのそれらの順序は重要ではありません。Amazon Redshift は、PARTITIONED BY 句で定義された順序を使用して、外部テーブルを作成します。
-
Amazon Redshift は、パーティションキーの値に基づいて、出力ファイルをパーティションフォルダに自動的にパーティション分割します。デフォルトでは、Amazon Redshift はパーティション列を出力ファイルから削除します。
-
LINES TERMINATED BY 'delimiter' 句はサポートされていません。
-
ROW FORMAT SERDE 'serde_name' 句はサポートされていません。
-
マニフェストファイルの使用はサポートされていません。したがって、Amazon S3 のマニフェストファイルに LOCATION 句を定義することはできません。
-
Amazon Redshift は、コマンドの最後で 'numRows' テーブルプロパティを自動的に更新します。
-
'compression_type' テーブルプロパティは、PARQUET ファイル形式に基づいて 'none' または 'snappy' のみを受け入れます。
-
Amazon Redshift では、外側の SELECT クエリで LIMIT 句を使用できません。代わりに、ネストされた LIMIT 句を使用できます。
-
STL_UNLOAD_LOG を使用して、各 CREATE EXTERNAL TABLE AS オペレーションによって Amazon S3 に書き込まれたファイルを追跡できます。
外部テーブルの作成およびクエリのアクセス許可
外部テーブルを作成するには、外部スキーマの所有者またはスーパーユーザーであることを確認してください。外部スキーマの所有者を移行するには、「ALTER SCHEMA」を使用します。次の例は、spectrum_schema
スキーマの所有者を newowner
に変更します。
alter schema spectrum_schema owner to newowner;
Redshift Spectrum クエリを実行するには、次のアクセス権限が必要です。
-
スキーマのアクセス権限の使用
-
現在のデータベースに一時テーブルを作成するアクセス権限
次の例では、スキーマ spectrum_schema
の使用許可を spectrumusers
ユーザーグループに付与しています。
grant usage on schema spectrum_schema to group spectrumusers;
次の例では、データベース spectrumdb
の一時アクセス権限を spectrumusers
ユーザーグループに付与しています。
grant temp on database spectrumdb to group spectrumusers;
疑似列
Amazon Redshift はデフォルトで疑似列 $path および $size を使用して外部テーブルを作成します。これらの列を選択すると、Amazon S3 のデータファイルへのパスとクエリによって返された各行のデータファイルのサイズが表示されます。列名 ($path および $size) は、二重引用符で囲む必要があります。SELECT * 句は、疑似列を返しません。次の例に示すように、$path と $size の列名をクエリに明示的に含める必要があります。
select "$path", "$size" from spectrum.sales_part where saledate = '2008-12-01';
セッションの疑似列の作成を無効にするには、spectrum_enable_pseudo_columns 設定パラメータを false に設定します。
重要
Redshift Spectrum では、Amazon S3 のデータファイルをスキャンして結果セットのサイズを確認しているため、$size または $path を選択すると料金が発生します。詳細については、Amazon Redshift の料金
データ処理オプションの設定
テーブルパラメータを設定して、外部テーブルでクエリされているデータの入力処理を指定できます。これには、以下が含まれます。
-
VARCHAR、CHAR、および文字列データが含まれる列内の余剰文字。詳細については、外部テーブルプロパティ「
surplus_char_handling
」を参照してください。 -
VARCHAR、CHAR、および文字列データが含まれる列内の無効な文字。詳細については、外部テーブルプロパティ「
invalid_char_handling
」を参照してください。 -
外部テーブルプロパティ
invalid_char_handling
に REPLACE を指定するときに使用する置換文字。 -
整数と小数のデータが含まれる列内でのキャストのオーバーフロー処理。詳細については、外部テーブルプロパティ「
numeric_overflow_handling
」を参照してください。 -
Surplus_bytes_handling は、varbyte データを含む列の余剰バイトの入力処理を指定します。詳細については、外部テーブルプロパティ「
surplus_bytes_handling
」を参照してください。