外部テーブルへのデータのエクスポート
外部テーブルを定義し、データをエクスポートすることによって、データをエクスポートできます。 テーブルのプロパティは、 外部テーブルを作成するときに指定します。 エクスポート コマンドは、外部テーブルを名前で参照します。
アクセス許可
このコマンドを実行するには、少なくとも Table 管理者 アクセス許可が必要です。
構文
.export
[async
] to
table
externalTableName
[with
(
propertyName=
propertyValue [,
...])
] <|
クエリ
構文規則について詳しく知る。
パラメーター
件名 | タイプ | Required | 説明 |
---|---|---|---|
externalTableName | string |
✔️ | エクスポート先の外部テーブルの名前。 |
propertyName, propertyValue | string |
省略可能な プロパティのコンマ区切りリスト。 | |
クエリ | string |
✔️ | エクスポート クエリ。 |
サポートされるプロパティ
外部テーブルへのエクスポート コマンドの一部として、次のプロパティがサポートされています。
プロパティ | タイプ | 説明 | Default |
---|---|---|---|
sizeLimit |
long |
圧縮前に書き込まれた 1 つのストレージ 成果物のサイズ制限 (バイト単位)。 この行グループがサイズ制限に達し、新しい成果物を開始する必要があるかどうかを確認する前に、サイズ parquetRowGroupSize の完全な行グループが書き込まれます。 有効な範囲: 100 MB (既定値) から 1 GB。 |
|
distributed |
bool |
分散エクスポートを無効または有効にします。 false に設定*することは、single distribution ヒント*と同じことを意味します。 |
既定値は true です。 |
distribution |
string |
ディストリビューション ヒント (single 、per_node 、per_shard )。 詳細については、 Distribution の設定を参照してください。 |
既定値は per_node です。 |
distributionKind |
string |
必要に応じて、外部テーブルが文字列パーティションでパーティション分割されている場合に、均一分散に切り替えます。 有効な値は uniform または default です。 詳細については、 Distribution の設定を参照してください。 |
|
concurrency |
番号 | システムに対して並列実行するパーティションの数をヒントします。 詳細については、 Distribution の設定を参照してください。 | 既定値は 16 です。 |
spread |
番号 | パーティションをノード間で分散する方法をシステムにヒントを提供します。 詳細については、 Distribution の設定を参照してください。 | 既定値は Min(64, number-of-nodes) です。 |
parquetRowGroupSize |
int |
データ形式が Parquet の場合にのみ関連します。 エクスポート*されたファイル*内の行*グループ*のサイズを制御します。 この値は sizeLimit よりも優先されます。つまり、この行グループがサイズ制限に達し、新しい成果物を開始する必要があるかどうかを確認する前に、完全な行グループがエクスポートされます。 |
既定の行グループ サイズは 100,000 レコードです。 |
配布の設定
外部テーブルへのエクスポート操作の分散は、ストレージに同時に書き込むノードとスレッドの数を示します。 既定のディストリビューションは、外部テーブルのパーティション分割によって異なります。
外部テーブルのパーティション分割 | 既定のディストリビューション |
---|---|
外部テーブルがパーティション分割されていないか、列によってのみパーティション分割datetime |
エクスポートは per_node 分散されます。すべてのノードが同時にエクスポートされます。 各ノードは、そのノードに割り当てられたデータを書き込みます。 ノードによってエクスポートされるファイルの数が 1 より大きいのは、そのノードのデータのサイズが sizeLimit を超えた場合のみです。 |
外部テーブルが文字列列によってパーティション分割される | 各ノードがパーティション値のサブセットを書き込むよう、エクスポートするデータがノード間で移動されます。 1 つのパーティションは、常に 1 つのノードによって書き込まれます。 パーティションごとに書き込まれるファイルの数は、データが sizeLimit を超える場合にのみ 1 つを超える必要があります。 外部テーブルに複数の文字列パーティションが含まれている場合、データは最初のパーティションに基づいてノード間でパーティション分割されます。 そのため、最も均一な分散を持つパーティションを最初のパーティションとして定義することをお勧めします。 |
既定の配布設定を変更する
既定の配布設定を変更すると、次の場合に役立ちます。
ユース ケース | 説明 | 推奨 |
---|---|---|
エクスポートされたファイルの数を減らす | エクスポートによって作成されるファイルの数が少なすぎるため、より小さいサイズのファイルを作成する必要があります。 | コマンド プロパティで distribution =single または distributed =false (両方とも同等) を設定します。 エクスポートを実行するのは 1 つのスレッドだけです。 この欠点は、コンカレンシーが大幅に減少するため、エクスポート操作が遅くなる可能性があるということです。 |
エクスポート期間を短縮する | エクスポート操作のコンカレンシーを増やして、その期間を短縮します。 | コマンドのプロパティで distribution =per_shard を設定します。 そうすることで、書き込み操作のコンカレンシーはノードごとではなく、データ シャードごとに行われます。 これは、文字列パーティションでパーティション分割されていない外部テーブルにエクスポートする場合にのみ関連します。 これにより、ストレージに負荷がかかりすぎるため、調整が発生する可能性があります。
Storage エラーを参照してください。 |
文字列パーティションでパーティション分割された外部テーブルのエクスポート期間を短縮する | パーティションがノード間で均等に分散されていない場合、エクスポートの実行に時間がかかる場合があります。 1 つのパーティションが他のパーティションよりもはるかに大きい場合、そのパーティションに割り当てられたノードはエクスポート作業のほとんどを行い、他のノードはほとんどアイドル状態のままです。 詳細については、「配布設定 |
いくつかの設定を変更できます。 * 複数の文字列パーティションがある場合は、最初に最適なディストリビューションを持つパーティションを定義します。 * コマンドプロパティで distributionKind =uniform を設定します。 この設定により、文字列パーティション分割された外部テーブルの既定の配布設定が無効になります。 エクスポートは per-node ディストリビューションで実行され、各ノードはノードに割り当てられたデータをエクスポートします。 1 つのパーティションが複数のノードによって書き込まれる場合があり、それに応じてファイルの数が増えます。 コンカレンシーをさらに高めるために、最も高いコンカレンシーを得るために distributionKind =uniform と distribution =per_shard を設定します (書き込まれるファイルが多くなる可能性があります)* 低速エクスポートの原因がデータの外れ値でない場合は、パーティション設定を変更せずにコンカレンシーを増やすことで期間を短縮します。 パーティション分割のコンカレンシーを決定する hint.spread プロパティと hint.concurrency プロパティを使用します。 パーティション演算子 参照。 既定では、同時にエクスポートするノードの数 (spread ) は、64 からノード数までの最小値です。
spread をノード数よりも多く設定すると、各ノードのコンカレンシーが増加します (spread の最大値は 64 です)。 |
認証と権限承認
外部テーブルにエクスポートするには、書き込みアクセス許可を設定する必要があります。
詳細については、「Azure Storage 外部テーブルの書き込みアクセス許可または
出力
出力パラメーター | タイプ | 説明 |
---|---|---|
ExternalTableName | string |
外部テーブルの名前。 |
Path | string |
出力パスです。 |
NumRecords | string |
パスにエクスポートされたレコード数。 |
メモ
エクスポート クエリの出力スキーマは、パーティションで定義されているすべての列を含め、外部テーブルのスキーマと一致する必要があります。 たとえば、テーブルが DateTime でパーティション分割されている場合、クエリ出力スキーマには、タイムスタンプ columnname と一致する Timestamp 列が必要です。 この列名は、外部テーブルのパーティション分割定義で定義されています。
エクスポート コマンドを使用して外部テーブルのプロパティを上書きすることはできません。 たとえば、Parquet 形式のデータを、データ形式が CSV である外部テーブルにエクスポートすることはできません。
外部テーブルがパーティション分割されている場合、エクスポートされた成果物はパーティション定義に従ってそれぞれのディレクトリに書き込まれます。 例については、パーティション分割された外部テーブル 例を参照してください。
- パーティション値が null または空であるか、または無効なディレクトリ値の場合、ターゲットストレージの定義に従って、パーティション値は既定値の
__DEFAULT_PARTITION__
に置き換えられます。
- パーティション値が null または空であるか、または無効なディレクトリ値の場合、ターゲットストレージの定義に従って、パーティション値は既定値の
エクスポート コマンドの実行中にストレージ エラーを解決するための推奨事項については、「エクスポート コマンドのエラー」を参照してください。
外部テーブルの列は、 データ型のマッピング 規則に従って、適切なターゲット形式のデータ型にマップされます。
Parquet ネイティブ エクスポートは、よりパフォーマンスが高く、リソースの軽いエクスポート メカニズムです。 エクスポートされた
datetime
列は現在、Synapse SQLCOPY
ではサポートされていません。
ファイルの数
パーティションごとに書き込まれるファイルの数は、エクスポート操作の 分散設定 によって異なります。
外部テーブルに
datetime
パーティションのみが含まれている場合、またはパーティションがまったくない場合、存在する各パーティションに書き込まれるファイルの数は、ノードの数 (sizeLimit
に達した場合は複数) と同じにする必要があります。 エクスポート操作が分散されると、すべてのノードが同時にエクスポートされます。 単一のノードのみが書き込みを行うようにディストリビューションを無効にするには、distributed
を false に設定します。 このプロセスでは、作成されるファイルが少なくなりますが、エクスポートのパフォーマンスが低下します。外部テーブルに文字列型の列によってパーティションが含まれている場合、エクスポートされるファイルの数は、パーティションごとに1つのファイルである必要があります (または
sizeLimit
に達した場合)。 すべてのノードは引き続きエクスポートに参加します (操作は分散されます) が、各パーティションは特定のノードに割り当てられます。distributed
を false に設定すると、1 つのノードのみがエクスポートされますが、動作は変わりません (パーティションごとに 1 つのファイルが書き込まれます)。
例
パーティション分割されていない外部テーブルの例
次の例では、テーブル T
から ExternalBlob
テーブルにデータをエクスポートします。
ExternalBlob
は、パーティション分割されていない外部テーブルです。
.export to table ExternalBlob <| T
出力
ExternalTableName | Path | NumRecords |
---|---|---|
ExternalBlob | http://storage1.blob.core.windows.net/externaltable1cont1/1_58017c550b384c0db0fea61a8661333e.csv | 10 |
パーティション分割されている外部テーブルの例
次の例では、最初にパーティション分割された外部テーブルを作成し、指定した BLOB ストレージの場所を PartitionedExternalBlob
します。 データは、顧客の名前と日付でデータを整理するパス形式で CSV 形式で格納されます。
.create external table PartitionedExternalBlob (Timestamp:datetime, CustomerName:string)
kind=blob
partition by (CustomerName:string=CustomerName, Date:datetime=startofday(Timestamp))
pathformat = ("CustomerName=" CustomerName "/" datetime_pattern("yyyy/MM/dd", Date))
dataformat=csv
(
h@'http://storageaccount.blob.core.windows.net/container1;secretKey'
)
次に、テーブル T
から PartitionedExternalBlob
外部テーブルにデータをエクスポートします。
.export to table PartitionedExternalBlob <| T
出力
ExternalTableName | Path | NumRecords |
---|---|---|
ExternalBlob | http://storageaccount.blob.core.windows.net/container1/CustomerName=customer1/2019/01/01/fa36f35c-c064-414d-b8e2-e75cf157ec35_1_58017c550b384c0db0fea61a8661333e.csv | 10 |
ExternalBlob | http://storageaccount.blob.core.windows.net/container1/CustomerName=customer2/2019/01/01/fa36f35c-c064-414d-b8e2-e75cf157ec35_2_b785beec2c004d93b7cd531208424dc9.csv | 10 |
コマンドが async
キーワードを使用して非同期的に実行される場合、出力は show operation details コマンドを使用して使用できます。
関連コンテンツ
- 継続的なデータ エクスポート の
- 管理コマンドの概要
- 外部テーブル を
する - SQL にデータをエクスポートする
- クラウド ストレージ にデータをエクスポートする