次の方法で共有


クイック スタート: COPY ステートメントを使用してデータを一括読み込みする

このクイック スタートでは、シンプルで柔軟な COPY ステートメント を使用して専用 SQL プールにデータを一括読み込みし、高スループットのデータ インジェストを行います。 COPY ステートメントは、次の機能を提供することでシームレスかつ柔軟にデータを読み込むため、推奨される読み込みユーティリティです。

  • データ ウェアハウスに対する厳密な CONTROL アクセス許可を必要とせずに、低い特権を持つユーザーに読み込みを許可する
  • 追加のデータベース オブジェクトを作成することなく、1 つの T-SQL ステートメントのみを活用する
  • Share Access Signature (SAS) を使用してストレージ アカウント キーを公開せずに、より細かいアクセス許可モデルを活用する
  • ERRORFILE の場所に別のストレージ アカウントを指定する (REJECTED_ROW_LOCATION)
  • ターゲット列ごとに既定値をカスタマイズし、特定のターゲット列に読み込むソース データ フィールドを指定できます。
  • CSV ファイルのカスタム行ターミネータを指定する
  • CSV ファイルの文字列、フィールド、および行の区切り記号をエスケープする
  • CSV ファイルに SQL Server 日付形式を利用する
  • 保存場所のパスにワイルドカードや複数のファイルを指定できます。

前提条件

このクイックスタートは、専用 SQL プールが既に用意されていることを前提としています。 専用 SQL プールが作成されていない場合は、 作成と接続 - ポータル のクイックスタートを使用します。

必要なアクセス許可を設定する

-- List the permissions for your user
select  princ.name
,       princ.type_desc
,       perm.permission_name
,       perm.state_desc
,       perm.class_desc
,       object_name(perm.major_id)
from    sys.database_principals princ
left join
        sys.database_permissions perm
on      perm.grantee_principal_id = princ.principal_id
where name = '<yourusername>';

--Make sure your user has the permissions to CREATE tables in the [dbo] schema
GRANT CREATE TABLE TO <yourusername>;
GRANT ALTER ON SCHEMA::dbo TO <yourusername>;

--Make sure your user has ADMINISTER DATABASE BULK OPERATIONS permissions
GRANT ADMINISTER DATABASE BULK OPERATIONS TO <yourusername>

--Make sure your user has INSERT permissions on the target table
GRANT INSERT ON <yourtable> TO <yourusername>

ターゲット テーブルを作成する

この例では、ニューヨークのタクシー データセットからデータを読み込みます。 1 年以内に取得されたタクシー乗車を表す Trip というテーブルを読み込みます。 次のコマンドを実行してテーブルを作成します。

CREATE TABLE [dbo].[Trip]
(
    [DateID] int NOT NULL,
    [MedallionID] int NOT NULL,
    [HackneyLicenseID] int NOT NULL,
    [PickupTimeID] int NOT NULL,
    [DropoffTimeID] int NOT NULL,
    [PickupGeographyID] int NULL,
    [DropoffGeographyID] int NULL,
    [PickupLatitude] float NULL,
    [PickupLongitude] float NULL,
    [PickupLatLong] varchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [DropoffLatitude] float NULL,
    [DropoffLongitude] float NULL,
    [DropoffLatLong] varchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [PassengerCount] int NULL,
    [TripDurationSeconds] int NULL,
    [TripDistanceMiles] float NULL,
    [PaymentType] varchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [FareAmount] money NULL,
    [SurchargeAmount] money NULL,
    [TaxAmount] money NULL,
    [TipAmount] money NULL,
    [TollsAmount] money NULL,
    [TotalAmount] money NULL
)
WITH
(
    DISTRIBUTION = ROUND_ROBIN,
    CLUSTERED COLUMNSTORE INDEX
);

COPY ステートメントを実行する

次の COPY ステートメントを実行して、Azure BLOB ストレージ アカウントから Trip テーブルにデータを読み込みます。

COPY INTO [dbo].[Trip] FROM 'https://nytaxiblob.blob.core.windows.net/2013/Trip2013/'
WITH (
   FIELDTERMINATOR='|',
   ROWTERMINATOR='0x0A'
) OPTION (LABEL = 'COPY: dbo.trip');

負荷を監視する

次のクエリを定期的に実行して、読み込みが進行しているかどうかを確認します。

SELECT  r.[request_id]                           
,       r.[status]                               
,       r.resource_class                         
,       r.command
,       sum(bytes_processed) AS bytes_processed
,       sum(rows_processed) AS rows_processed
FROM    sys.dm_pdw_exec_requests r
              JOIN sys.dm_pdw_dms_workers w
                     ON r.[request_id] = w.request_id
WHERE [label] = 'COPY: dbo.trip' and session_id <> session_id() and type = 'WRITER'
GROUP BY r.[request_id]                           
,       r.[status]                               
,       r.resource_class                         
,       r.command;

次のステップ

  • データ読み込みのベスト プラクティスについては、「データの 読み込みのベスト プラクティス」を参照してください。
  • データ読み込みのリソースを管理する方法については、「ワークロードの 分離」を参照してください。