Azure Data Factory を使用して OData ソースからデータを移動する

Note

この記事は、Data Factory のバージョン 1 に適用されます。 現在のバージョンの Data Factory サービスを使用している場合は、V2 の OData コネクタに関するページを参照してください。

この記事では、Azure Data Factory のコピー アクティビティを使って、OData ソースからデータを移動する方法について説明します。 この記事は、コピー アクティビティによるデータ移動の一般的な概要について説明している、データ移動アクティビティに関する記事に基づいています。

OData ストアから、サポートされている任意のシンク データ ストアにデータをコピーできます。 コピー アクティビティによってシンクとしてサポートされているデータ ストアの一覧については、サポートされているデータ ストアの表をご覧ください。 データ ファクトリは、他のデータ ストアから OData ソースへのデータの移動ではなく、OData ソースから他のデータ ストアへのデータの移動のみをサポートします。

サポートされているバージョンと認証の種類

この OData コネクタは OData バージョン 3.0 および 4.0 をサポートしているため、クラウド OData とオンプレミス OData のどちらのソースのデータもコピーできます。 後者の場合は、Data Management Gateway のインストールが必要になります。 Data Management Gateway の詳細については、 オンプレミスとクラウド間でのデータ移動 に関する記事を参照してください。

次の認証の種類がサポートされています。

  • クラウド OData フィードにアクセスするには、匿名認証、基本認証 (ユーザー名とパスワード)、または Azure Active Directory ベースの OAuth 認証を使用できます。
  • オンプレミス OData フィードにアクセスするには、匿名認証、基本認証 (ユーザー名とパスワード)、または Windows 認証を使用できます。

作業の開始

さまざまなツール/API を使用して、OData ソースからデータを移動するコピー アクティビティを含むパイプラインを作成できます。

パイプラインを作成する最も簡単な方法は、コピー ウィザードを使うことです。 「チュートリアル:コピー ウィザードを使用してパイプラインを作成する」を参照してください。データのコピー ウィザードを使用してパイプラインを作成する簡単なチュートリアルです。

また、次のツールを使用してパイプラインを作成することもできます。Visual StudioAzure PowerShellAzure Resource Manager テンプレート.NET APIREST API。 コピー アクティビティを含むパイプラインを作成するための詳細な手順については、コピー アクティビティのチュートリアルをご覧ください。

ツールと API のいずれを使用する場合も、次の手順を実行して、ソース データ ストアからシンク データ ストアにデータを移動するパイプラインを作成します。

  1. リンクされたサービスを作成し、入力データ ストアと出力データ ストアをデータ ファクトリにリンクします。
  2. コピー操作用の入力データと出力データを表すデータセットを作成します。
  3. 入力としてのデータセットと出力としてのデータセットを受け取るコピー アクティビティを含むパイプラインを作成します。

ウィザードを使用すると、Data Factory エンティティ (リンクされたサービス、データセット、パイプライン) に関する JSON の定義が自動的に作成されます。 (.NET API を除く) ツールまたは API を使う場合は、JSON 形式でこれらの Data Factory エンティティを定義します。 OData ソースからデータをコピーするために使用する Data Factory エンティティに関する JSON 定義のサンプルについては、この記事のセクション、「JSON の使用例: OData ソースから Azure BLOB へのデータのコピー」をご覧ください。

次のセクションでは、OData ソースに固有の Data Factory エンティティの定義に使用される JSON プロパティについて詳しく説明します。

リンクされたサービスのプロパティ

次の表は、OData のリンクされたサービスに固有の JSON 要素の説明をまとめたものです。

プロパティ 説明 必須
type type プロパティを OData はい
url OData サービスの URL です。 はい
authenticationType OData ソースへの接続に使用される認証の種類です。

クラウド OData の場合、有効な値は、匿名、基本、または OAuth です (Azure Data Factory で現在サポートされているのは Azure Active Directory ベースの OAuth のみです)。

オンプレミスの OData では、Anonymous、Basic、Windows のいずれかの値になります。
はい
username 基本認証を使用している場合は、ユーザー名を指定します。 はい (基本認証を使用している場合のみ)
password ユーザー名に指定したユーザー アカウントのパスワードを指定します。 はい (基本認証を使用している場合のみ)
authorizedCredential OAuth を使用している場合は、Data Factory コピー ウィザードまたはエディターの [承認] ボタンをクリックして資格情報を入力すると、このプロパティの値が自動生成されます。 はい (OAuth 認証を使用している場合のみ)
gatewayName Data Factory サービスが、オンプレミスの OData サービスへの接続に使用するゲートウェイの名前。 オンプレミスの OData ソースからデータをコピーする場合にのみ指定します。 いいえ

基本認証を使用する

{
    "name": "inputLinkedService",
    "properties":
    {
        "type": "OData",
        "typeProperties":
        {
            "url": "https://services.odata.org/OData/OData.svc",
            "authenticationType": "Basic",
            "username": "username",
            "password": "password"
        }
    }
}

匿名認証を使用する

{
    "name": "ODataLinkedService",
    "properties":
    {
        "type": "OData",
        "typeProperties":
        {
            "url": "https://services.odata.org/OData/OData.svc",
            "authenticationType": "Anonymous"
        }
    }
}

オンプレミス OData ソースにアクセスする際に Windows 認証を使用する

{
    "name": "inputLinkedService",
    "properties":
    {
        "type": "OData",
        "typeProperties":
        {
            "url": "<endpoint of on-premises OData source e.g. Dynamics CRM>",
            "authenticationType": "Windows",
            "username": "domain\\user",
            "password": "password",
            "gatewayName": "mygateway"
        }
    }
}

クラウド OData ソースにアクセスする際に OAuth 認証を使用する

{
    "name": "inputLinkedService",
    "properties":
    {
        "type": "OData",
            "typeProperties":
        {
            "url": "<endpoint of cloud OData source e.g. https://<tenant>.crm.dynamics.com/XRMServices/2011/OrganizationData.svc>",
            "authenticationType": "OAuth",
            "authorizedCredential": "<auto generated by clicking the Authorize button on UI>"
        }
    }
}

データセットのプロパティ

データセットの定義に利用できるセクションと&プロパティの完全な一覧については、データセットの作成に関する記事をご覧ください。 データセット JSON の構造、可用性、ポリシーなどのセクションは、データセットのすべての型 (Azure SQL、Azure BLOB、Azure テーブルなど) でほぼ同じです。

typeProperties セクションはデータセット型ごとに異なり、データ ストアのデータの場所などに関する情報を提供します。 ODataResource 型のデータセット (OData データセットを含む) の typeProperties セクションには次のプロパティがあります。

プロパティ 説明 必須
path OData リソースへのパス いいえ

コピー アクティビティのプロパティ

アクティビティの定義に利用できるセクションと&プロパティの完全な一覧については、パイプラインの作成に関する記事を参照してください。 名前、説明、入力テーブル、出力テーブル、ポリシーなどのプロパティは、あらゆる種類のアクティビティで使用できます。

一方、アクティビティの typeProperties セクションで使用できるプロパティは、各アクティビティの種類によって異なります。 コピー アクティビティの場合、ソースとシンクの種類によって異なります。

source の種類が RelationalSource (OData を含む) である場合は、typeProperties セクションで次のプロパティを使用できます。

プロパティ 説明 必須
query カスタム クエリを使用してデータを読み取ります。 "?$select=Name, Description&$top=5" いいえ

OData の型マッピング

データ移動アクティビティ に関する記事のとおり、コピー アクティビティは次の 2 段階のアプローチで型を source から sink に自動的に変換します。

  1. ネイティブの source 型から .NET 型に変換する
  2. .NET 型からネイティブの sink 型に変換する

OData からデータを移動する場合、OData 型から .NET 型に対する次のマッピングが使用されます。

OData データ型 .NET 型
Edm.Binary Byte[]
Edm.Boolean Bool
Edm.Byte Byte[]
Edm.DateTime DateTime
Edm.Decimal Decimal
Edm.Double Double
Edm.Single Single
Edm.Guid Guid
Edm.Int16 Int16
Edm.Int32 Int32
Edm.Int64 Int64
Edm.SByte Int16
Edm.String String
Edm.Time TimeSpan
Edm.DateTimeOffset DateTimeOffset

注意

OData の複雑なデータ型 (オブジェクト型など) はサポートされていません。

JSON の使用例: OData ソースから Azure Blob にデータをコピーする

次の例は、Visual Studio または Azure PowerShell を使用してパイプラインを作成する際に使用できるサンプルの JSON 定義です。 これらの例は、OData ソースから Azure BLOB ストレージにデータをコピーする方法を示しています。 ただし、Azure Data Factory のコピー アクティビティを使用して、 こちら に記載されているシンクのいずれかにデータをコピーすることができます。 このサンプルでは、次の Data Factory のエンティティがあります。

  1. OData型のリンクされたサービス。
  2. AzureStorage型のリンクされたサービス。
  3. ODataResource 型の入力データセット
  4. AzureBlob 型の出力データセット
  5. RelationalSourceBlobSink を使用するコピー アクティビティを含むパイプライン

サンプルでは、1 時間ごとに OData ソースに対するクエリの結果のデータを Azure Blob にコピーします。 これらのサンプルで使用される JSON プロパティの説明はサンプルに続くセクションにあります。

OData のリンクされたサービス: 次のサンプルは匿名認証を使用しています。 使用可能なさまざまな種類の認証については、 ODBC のリンクされたサービス に関するセクションをご覧ください。

{
    "name": "ODataLinkedService",
    "properties":
    {
        "type": "OData",
        "typeProperties":
        {
            "url": "https://services.odata.org/OData/OData.svc",
            "authenticationType": "Anonymous"
        }
    }
}

Azure Storage のリンクされたサービス:

{
    "name": "AzureStorageLinkedService",
    "properties": {
        "type": "AzureStorage",
        "typeProperties": {
            "connectionString": "DefaultEndpointsProtocol=https;AccountName=<accountname>;AccountKey=<accountkey>"
        }
    }
}

OData の入力データセット:

"external" を "true" に設定すると、データセットが Data Factory の外部にあり、Data Factory のアクティビティによって生成されたものではないことが Data Factory サービスに通知されます。

{
    "name": "ODataDataset",
    "properties":
    {
        "type": "ODataResource",
        "typeProperties":
        {
            "path": "Products"
        },
        "linkedServiceName": "ODataLinkedService",
        "structure": [],
        "availability": {
            "frequency": "Hour",
            "interval": 1
        },
        "external": true,
        "policy": {
            "retryInterval": "00:01:00",
            "retryTimeout": "00:10:00",
            "maximumRetry": 3
        }
    }
}

データセット定義での パス の指定は省略可能です。

Azure BLOB の出力データセット:

データは新しい BLOB に 1 時間おきに書き込まれます (frequency: hour、interval: 1)。 BLOB のフォルダー パスは、処理中のスライスの開始時間に基づき、動的に評価されます。 フォルダー パスは開始時間の年、月、日、時刻の部分を使用します。

{
    "name": "AzureBlobODataDataSet",
    "properties": {
        "type": "AzureBlob",
        "linkedServiceName": "AzureStorageLinkedService",
        "typeProperties": {
            "folderPath": "mycontainer/odata/yearno={Year}/monthno={Month}/dayno={Day}/hourno={Hour}",
            "format": {
                "type": "TextFormat",
                "rowDelimiter": "\n",
                "columnDelimiter": "\t"
            },
            "partitionedBy": [
                {
                    "name": "Year",
                    "value": {
                        "type": "DateTime",
                        "date": "SliceStart",
                        "format": "yyyy"
                    }
                },
                {
                    "name": "Month",
                    "value": {
                        "type": "DateTime",
                        "date": "SliceStart",
                        "format": "MM"
                    }
                },
                {
                    "name": "Day",
                    "value": {
                        "type": "DateTime",
                        "date": "SliceStart",
                        "format": "dd"
                    }
                },
                {
                    "name": "Hour",
                    "value": {
                        "type": "DateTime",
                        "date": "SliceStart",
                        "format": "HH"
                    }
                }
            ]
        },
        "availability": {
            "frequency": "Hour",
            "interval": 1
        }
    }
}

OData ソースおよび BLOB シンクを使用するパイプラインでのコピー アクティビティ:

パイプラインには、入力データセットと出力データセットを使用するように構成され、1 時間おきに実行するようにスケジュールされているコピー アクティビティが含まれています。 パイプライン JSON 定義で、source 型が RelationalSource に設定され、sink 型が BlobSink に設定されています。 query プロパティに指定された SQL クエリは、OData ソースの最新のデータを選択します。

{
    "name": "CopyODataToBlob",
    "properties": {
        "description": "pipeline for copy activity",
        "activities": [
            {
                "type": "Copy",
                "typeProperties": {
                    "source": {
                        "type": "RelationalSource",
                        "query": "?$select=Name, Description&$top=5",
                    },
                    "sink": {
                        "type": "BlobSink",
                        "writeBatchSize": 0,
                        "writeBatchTimeout": "00:00:00"
                    }
                },
                "inputs": [
                    {
                        "name": "ODataDataSet"
                    }
                ],
                "outputs": [
                    {
                        "name": "AzureBlobODataDataSet"
                    }
                ],
                "policy": {
                    "timeout": "01:00:00",
                    "concurrency": 1
                },
                "scheduler": {
                    "frequency": "Hour",
                    "interval": 1
                },
                "name": "ODataToBlob"
            }
        ],
        "start": "2017-02-01T18:00:00Z",
        "end": "2017-02-03T19:00:00Z"
    }
}

パイプライン定義での クエリ の指定は省略可能です。 Data Factory サービスでデータの取得に使用する URL は次の形式になります: リンクされたサービスに指定した URL (必須) + データセットに指定したパス (オプション) + パイプラインのクエリ (オプション)。

OData の型マッピング

データ移動アクティビティ に関する記事のとおり、コピー アクティビティは次の 2 段階のアプローチで型を source から sink に自動的に変換します。

  1. ネイティブの source 型から .NET 型に変換する
  2. .NET 型からネイティブの sink 型に変換する

OData データ ストアからデータを移動するとき、OData データ型は .NET 型にマップされます。

ソース列からシンク列へのマップ

ソース データセット列のシンク データセット列へのマッピングの詳細については、Azure Data Factory のデータセット列のマッピングに関するページをご覧ください。

リレーショナル ソースからの反復可能読み取り

リレーショナル データ ストアからデータをコピーする場合は、意図しない結果を避けるため、再現性に注意する必要があります。 Azure Data Factory では、スライスを手動で再実行できます。 障害が発生したときにスライスを再実行できるように、データセットの再試行ポリシーを構成することもできます。 いずれかの方法でスライスが再実行された際は、何度スライスが実行されても同じデータが読み込まれることを確認する必要があります。 リレーショナル ソースからの反復可能読み取りに関するページをご覧ください。

パフォーマンスとチューニング

Azure Data Factory でのデータ移動 (コピー アクティビティ) のパフォーマンスに影響する主な要因と、パフォーマンスを最適化するための各種方法については、「コピー アクティビティのパフォーマンスと&チューニングに関するガイド」を参照してください。