Transact-SQL を使用してウェアハウスにデータを取り込む

適用対象:✅ Microsoft Fabric のウェアハウス

Transact-SQL 言語には、レイクハウスとウェアハウス内の既存のテーブルからウェアハウス内の新しいテーブルに大規模なデータを読み込む際に使用できるオプションが用意されています。 これらのオプションは、新しい集計データを含むテーブルのバージョン、行のサブセットを含むテーブルのバージョンを作成する、または複雑なクエリの結果としてテーブルを作成する必要がある場合に便利です。 いくつかの例を見てみましょう。

クエリの結果を含む新しいテーブルを作成する

Microsoft Fabric のウェアハウスを使用すると、次の T-SQL ステートメントを使用して、T-SQL クエリの結果に基づいて新しいテーブルを簡単に作成できます。

  • CREATE TABLE AS SELECT (CTAS) ステートメントを使用すると、 SELECT ステートメントの出力からウェアハウスに新しいテーブルを作成できます。
  • SELECT INTO クエリ句を使用すると、任意のテーブル ソースから結果を選択し、結果を新しいテーブルにリダイレクトできます。 これは、T-SQL 言語の標準機能です。

これら 2 つのステートメントは似ているので、次の例は CTAS ステートメントに焦点を当てています。

CTAS ステートメントは、新しいテーブルへのインジェスト操作を並列で実行するため、データ変換とワークスペース内の新しいテーブルの作成に非常に効率的になります。

CTAS ステートメントの SELECT 部分には、次のオプションを使用できます。

  • ウェアハウス テーブルの読み取り (ステージング テーブルなど)。
  • Lakehouse の SQL 分析エンドポイントで自動生成されたテーブルを使用して、Lakehouse Delta Lake フォルダーを読み取ります。
  • OPENROWSET関数を使用して、Azure Data Lake または Azure Blob Storage から CSV、Parquet、または JSONL ファイルを直接読み取ります。

サンプル データセットを読み込むには、「 COPY ステートメントを使用してウェアハウスにデータを取り込む 」の手順に従って、サンプル データをウェアハウスに作成します。

Warehouse テーブルからテーブルを作成する

最初の例では、既存の dbo.TaxiTrips テーブルのコピーである新しいテーブルを作成し、2023 年のデータのみを含むようにフィルター処理する方法を示します。

CREATE TABLE dbo.TaxiTrips_2023
AS
SELECT * 
FROM dbo.TaxiTrips 
WHERE DATEPART(YEAR, tpep_pickup_datetime) = '2023';

Delta Lake フォルダーからテーブルを作成する

OneLake に保存されている Delta Lake フォルダーは、レイクハウスの /Tables フォルダーに格納されている場合、テーブルとして自動的に表されます。 次のコードでは、TaxiTrips_2023 の Delta Lake フォルダー /Tables/TaxiTripsから新しいテーブル を作成します。

CREATE TABLE dbo.TaxiTrips_2023
AS
SELECT * 
FROM MyLakehouse.dbo.TaxiTrips 
WHERE DATEPART(YEAR, tpep_pickup_datetime) = '2023';

Delta Lake フォルダーは、ファイルが格納されているレイクハウスを参照する 3 部構成の名前表記を使用して参照できます。 前のセクションで示したすべての例は、Delta Lake フォルダーに適用できます。

CSV/Parquet/JSONL ファイルからテーブルを作成する

OPENROWSET関数を使用して、外部ファイルから直接新しいテーブルを作成することもできます。 たとえば、次のサンプル T-SQL では、プレースホルダーを使用して、パブリック Parquet ファイルをインポートする方法を示します。

CREATE TABLE dbo.<table_name>
AS
SELECT *
FROM OPENROWSET(BULK 'https://<storage account>.blob.core.windows.net/public/<subfolder>/<file name>.parquet') AS data;

一般公開されている外部 CSV ファイルからデータを変換することで、新しいテーブルを作成できます。

CREATE TABLE dbo.<table name>
AS
SELECT *
FROM OPENROWSET(BULK 'https://<storage account>.blob.core.windows.net/public/<subfolder>/<file name>.csv') AS data;

または、パブリックに公開されている外部の JSONL ファイルからデータを変換して、新しいテーブルを作成することもできます。

CREATE TABLE dbo.<table name>
AS
SELECT *
FROM OPENROWSET(BULK 'https://<storage account>.blob.core.windows.net/public/<subfolder>/<file name>.jsonl') AS data;

T-SQL クエリを使用した既存テーブルへのデータの取り込み

前の例はクエリの結果に基づいて新しいテーブルを作成します。 例を既存のテーブルにレプリケートするには、 INSERT ... SELECT パターンを使用できます。

Warehouse テーブルからデータを取り込む

次のコードは、ウェアハウス テーブルから既存のテーブルに新しいデータを取り込みます。

INSERT INTO dbo.TaxiTrips_2023
SELECT *
FROM dbo.TaxiTrips
WHERE DATEPART(YEAR, tpep_pickup_datetime) = '2023';

SELECT ステートメントのクエリ条件は、結果のクエリ列の種類がコピー先テーブルの列と一致している限り、任意の有効なクエリにすることができます。 列名が指定され、コピー先テーブルの列のサブセットのみを含む場合、他のすべての列は NULL として読み込まれます。 詳細については、「INSERT INTO...SELECT を使用したログ記録と並列処理を最小限に抑えたデータの一括インポート」を参照してください。

Delta Lake フォルダーからデータを取り込む

OneLake に保存されている Delta Lake フォルダーは、レイクハウス内の /Tables フォルダーに格納されている場合、テーブルとして自動的に表されます。

次のコードは、/Tables/TaxiTrips lakehouse の Delta Lake フォルダー MyLakehouse* セクションから新しいデータを取り込みます。

INSERT INTO dbo.TaxiTrips_2023
SELECT *
FROM MyLakehouse.dbo.TaxiTrips 
WHERE DATEPART(YEAR, tpep_pickup_datetime) = '2023';

CSV/Parquet/JSONL ファイルからデータを取り込む

OPENROWSET関数をソースとして使用して、Parquet、CSV、または JSON ファイルをストレージから取り込むことができます。

INSERT INTO dbo.<table name>
SELECT *
FROM OPENROWSET(BULK 'https://<storage account>.blob.core.windows.net/public/<subfolder>/<file name>') AS data
WHERE DATEPART(YEAR, tpep_pickup_datetime) = '2023';

*.parquetなどのワイルドカードを使用するか、/year=*/month=*などのパーティション分割されたディレクトリを対象とすることで、複数のファイルを読み取ることができます。 パフォーマンスを最適化するには、WHERE 句にフィルターを適用して、クエリの実行中に不要な行とパーティションを排除します。

これらの例は、 COPY INTO でのインジェストで使用されるものと似ています。 COPY INTO コマンドは、特にソースから宛先へのデータの読み込みが簡単な場合に使用する方が簡単です。 ただし、ソース データを変換する必要がある場合 (値の変換や他のテーブルとの結合など)、 INSERT ... SELECT を使用すると、インジェスト中に変換を柔軟に実行できます。

OneLake からデータを取り込む

OPENROWSET関数をソースとして使用して、Fabric OneLake ストレージからデータを取り込むことができます。 {workspaceId}{lakehouseId} を次のサンプルにある対応するワークスペースおよびレイクハウスの GUID に置き換えてください。

INSERT INTO dbo.TaxiTrips_2023
SELECT *
FROM OPENROWSET(BULK 'https://onelake.dfs.fabric.microsoft.com/{workspaceId}/{lakehouseId}/Files/year=*/month=*/*.parquet') AS data
WHERE data.filepath(1) = '2023'

この例は、Azure Data Lake Storage からデータを読み取る前の例に基づいています。 この方法は、ソース データを変換する必要がある場合 (たとえば、値の変換、他のテーブルとの結合、特定のパーティションの読み取りなど) に使用します。 このような場合、 INSERT ... SELECT を使用すると、データ インジェスト中に変換を柔軟に適用できます。

異なるウェアハウスとレイクハウス上のテーブルからのデータの取り込み

CREATE TABLE AS SELECTINSERT ... SELECTの両方で、SELECT ステートメントでは、クロスウェアハウス クエリを使用して、宛先テーブルが格納されているウェアハウスとは異なるウェアハウス上のテーブルを参照することもできます。 これは、3 部構成の名前付け規則 [warehouse_or_lakehouse_name.][schema_name.]table_name を使用することで実現できます。 たとえば、次に示すワークスペース資産を持っているとしましょう。

  • 最新のデータを含む taxi_lakehouse という名前のレイクハウス。
  • 参照データに使用されるテーブルを含む reference_warehouse という名前のウェアハウス。
  • コピー先テーブルが作成される research_warehouse という名前のウェアハウス。

次のワークスペース資産上のテーブルのデータを結合するために、3 部構成の名前付けを使用する新しいテーブルを作成できます。

CREATE TABLE research_warehouse.dbo.taxi_trips
AS
SELECT *
FROM taxi_lakehouse.dbo.TaxiTrips AS latest
INNER JOIN reference_warehouse.dbo.TaxiTrips AS reference
ON latest.vendorId_lpep = reference.vendorId_lpep;

クロスウェアハウス クエリの詳細については、「クロスデータベース SQL クエリの記述」を参照してください。

T-SQL インジェストの監査と監視

T-SQL を介して実行される CTAS 操作と INSERT ... SELECT 操作の両方が 、ウェアハウスのクエリ履歴/アクティビティに表示され、他のウェアハウス操作と共に監視できます。

データ インジェスト オプション

ウェアハウスにデータを取り込むその他の方法は次のとおりです。