Azure Data Factory でサポートされるファイル形式と圧縮形式

このトピックが適用されるコネクタは、Amazon S3Azure BlobAzure Data Lake Storeファイル システムFTPHDFSHTTPSFTP です。

注意

この記事は、Azure Data Factory のバージョン 1 に適用されます。 Data Factory サービスの現在のバージョンを使用している場合は、Data Factory でサポートされているファイル形式と圧縮コーデックに関するページを参照してください。

Azure Data Factory は次のファイル形式をサポートしています。

テキスト形式

テキスト ファイルからの読み取りまたはテキスト ファイルへの書き込みを行うには、データセットの format セクション で type プロパティを TextFormat に設定します。 format セクションにオプションのプロパティを指定することもできます。 構成方法については、「TextFormat の例」セクションを参照してください。

プロパティ 説明 使用できる値 必須
columnDelimiter ファイル内の列を区切るために使用する文字。 データ内に存在する可能性が低い、出力できないような珍しい文字を使用することを検討します。 たとえば、"\u0001" を指定します。これは、見出しの先頭 (SOH) を表します。 許可される文字は 1 つだけです。 既定値はコンマ (,) です。

Unicode 文字を使用するには、Unicode 文字に関するページを参照して、対応するコードを取得してください。
いいえ
rowDelimiter ファイルの行を区切るための文字。 許可される文字は 1 つだけです。 読み取り時の既定値は ["\r\n"、"\r"、"\n"] のいずれかになり、書き込み時の既定値は "\r\n" になります。 いいえ
escapeChar 入力ファイルの列区切り記号をエスケープするための特殊文字。

escapeChar と quoteChar の両方をテーブルに指定することはできません。
許可される文字は 1 つだけです。 既定値はありません。

例:列区切り記号としてコンマ (,) を使用しているときに、テキストにもコンマ文字を含める必要がある場合 (例:"Hello, world")、エスケープ文字として "$" を定義し、ソースで文字列 "Hello$, world" を使用できます。
いいえ
quoteChar 文字列値を引用符で囲むための文字。 引用符文字内の列区切り記号と行区切り記号は文字列値の一部として扱われます。 このプロパティは、入力と出力の両方のデータセットに適用できます。

escapeChar と quoteChar の両方をテーブルに指定することはできません。
許可される文字は 1 つだけです。 既定値はありません。

たとえば、列の区切り文字としてコンマ (,) を使用しているときにテキストにもコンマ文字が必要な場合 (例: <Hello, world>)、引用符文字として " (二重引用符) を定義し、ソースで文字列 "Hello, world" を使用できます。
いいえ
nullValue null 値を表すための 1 つまたは複数の文字。 1 つ以上の文字。 既定値は、読み取り時は "\N" および "NULL" 、書き込み時は "\N" です。 いいえ
encodingName エンコーディング名を指定します。 有効なエンコード名。 詳細については、Encoding.EncodingName プロパティに関するページを参照してください。 例: windows-1250 または shift_jis。 既定値は UTF-8 です。 いいえ
firstRowAsHeader 先頭行をヘッダーと見なすかどうかを指定します。 入力データセットでは、Data Factory は先頭行をヘッダーとして読み取ります。 出力データセットでは、Data Factory は先頭行をヘッダーとして書き込みます。

サンプル シナリオについては、「firstRowAsHeaderskipLineCount を使用するシナリオ」を参照してください。
True
False (既定値)
いいえ
skipLineCount 入力ファイルからのデータ読み取り時にスキップする行数を示します。 skipLineCount と firstRowAsHeader の両方が指定されている場合、行が最初にスキップされ、次に、入力ファイルからヘッダー情報が読まれます。

サンプル シナリオについては、「firstRowAsHeaderskipLineCount を使用するシナリオ」を参照してください。
Integer いいえ
treatEmptyAsNull 入力ファイルからデータを読むとき、null 値として null または空の文字列を扱うことを指定します。 True (既定値)
False
いいえ

TextFormat の例

次のデータセットの JSON 定義では、省略可能なプロパティの一部が指定されます。

"typeProperties":
{
    "folderPath": "mycontainer/myfolder",
    "fileName": "myblobname",
    "format":
    {
        "type": "TextFormat",
        "columnDelimiter": ",",
        "rowDelimiter": ";",
        "quoteChar": "\"",
        "NullValue": "NaN",
        "firstRowAsHeader": true,
        "skipLineCount": 0,
        "treatEmptyAsNull": true
    }
},

quoteChar の代わりに escapeChar を使用するには、quoteChar の含まれる行を次の escapeChar で置き換えます。

"escapeChar": "$",

firstRowAsHeader と skipLineCount を使用するシナリオ

  • ファイル以外のソースからテキスト ファイルにコピーし、スキーマ メタデータ(例:SQL スキーマ) を含むヘッダー行を追加する。 このシナリオでは、出力データセットの firstRowAsHeader を True として指定します。
  • ヘッダー行を含むテキスト ファイルから、ファイル以外のシンクにコピーし、その行を削除する: 入力データセットの firstRowAsHeader を True として指定します。
  • テキスト ファイルからコピーして、データやヘッダー情報を含まない先頭の数行をスキップする: skipLineCount を指定して、スキップする行数を示します。 ファイルの残りの部分にヘッダー行が含まれている場合は、firstRowAsHeader も指定できます。 skipLineCountfirstRowAsHeader の両方を指定した場合は、まず行がスキップされ、次に入力ファイルからヘッダー情報が読み取られます。

JSON 形式

Azure Cosmos DB との間で JSON ファイルをそのままインポート/エクスポートする場合は、Azure Cosmos DB との間でのデータの移動に関する記事の「JSON ドキュメントのインポート/エクスポート」をご覧ください。

JSON ファイルを解析するか、JSON 形式でデータを書き込む場合は、format セクションの type プロパティを JsonFormat に設定します。 format セクションにオプションのプロパティを指定することもできます。 構成方法については、「JsonFormat の例」セクションを参照してください。

プロパティ 説明 必須
filePattern 各 JSON ファイルに格納されたデータのパターンを示します。 使用できる値は、setOfObjectsarrayOfObjects です。 既定値は setOfObjects です。 これらのパターンの詳細については、「JSON ファイルのパターン」セクションを参照してください。 いいえ
jsonNodeReference 同じパターンを持つ配列フィールド内のオブジェクトからのデータの反復処理と抽出を行う場合は、その配列の JSON のパスを指定します。 このプロパティは、JSON ファイルからデータをコピーするときにのみサポートされます。 いいえ
jsonPathDefinition カスタマイズされた列名 (先頭が小文字) での列マッピングごとに JSON のパス式を指定します。 このプロパティは JSON ファイルからデータをコピーするときにのみサポートされ、オブジェクトまたは配列からデータを抽出することができます。

ルート オブジェクトの直下のフィールドの場合、ルートの $ から記述します。jsonNodeReference プロパティによって選択された配列内のフィールドの場合、配列要素から記述します。 構成方法については、「JsonFormat の例」セクションを参照してください。
いいえ
encodingName エンコーディング名を指定します。 有効なエンコード名の一覧については、Encoding.EncodingName プロパティに関する記事を参照してください。 例: windows-1250 または shift_jis。 既定 値は、UTF-8 です。 いいえ
nestingSeparator 入れ子レベルの分割に使用される文字。 既定値は "." (ドット) です。 いいえ

JSON ファイルのパターン

コピー アクティビティでは、次の JSON ファイルのパターンを解析することができます。

  • タイプ I: setOfObjects

    各ファイルには、単一のオブジェクト、または改行区切り/連結された複数のオブジェクトが含まれます。 出力データセットでこのオプションを選択すると、コピー アクティビティによって、各オブジェクトが行ごとに配置された (改行区切り) 1 つの JSON ファイルが生成されます。

    • 単一オブジェクトの JSON の例

      {
          "time": "2015-04-29T07:12:20.9100000Z",
          "callingimsi": "466920403025604",
          "callingnum1": "678948008",
          "callingnum2": "567834760",
          "switch1": "China",
          "switch2": "Germany"
      }
      
    • 改行区切りの JSON の例

      {"time":"2015-04-29T07:12:20.9100000Z","callingimsi":"466920403025604","callingnum1":"678948008","callingnum2":"567834760","switch1":"China","switch2":"Germany"}
      {"time":"2015-04-29T07:13:21.0220000Z","callingimsi":"466922202613463","callingnum1":"123436380","callingnum2":"789037573","switch1":"US","switch2":"UK"}
      {"time":"2015-04-29T07:13:21.4370000Z","callingimsi":"466923101048691","callingnum1":"678901578","callingnum2":"345626404","switch1":"Germany","switch2":"UK"}
      
    • 連結 JSON の例

      {
          "time": "2015-04-29T07:12:20.9100000Z",
          "callingimsi": "466920403025604",
          "callingnum1": "678948008",
          "callingnum2": "567834760",
          "switch1": "China",
          "switch2": "Germany"
      }
      {
          "time": "2015-04-29T07:13:21.0220000Z",
          "callingimsi": "466922202613463",
          "callingnum1": "123436380",
          "callingnum2": "789037573",
          "switch1": "US",
          "switch2": "UK"
      }
      {
          "time": "2015-04-29T07:13:21.4370000Z",
          "callingimsi": "466923101048691",
          "callingnum1": "678901578",
          "callingnum2": "345626404",
          "switch1": "Germany",
          "switch2": "UK"
      }
      
  • タイプ II: arrayOfObjects

    各ファイルにはオブジェクトの配列が含まれます。

    [
        {
            "time": "2015-04-29T07:12:20.9100000Z",
            "callingimsi": "466920403025604",
            "callingnum1": "678948008",
            "callingnum2": "567834760",
            "switch1": "China",
            "switch2": "Germany"
        },
        {
            "time": "2015-04-29T07:13:21.0220000Z",
            "callingimsi": "466922202613463",
            "callingnum1": "123436380",
            "callingnum2": "789037573",
            "switch1": "US",
            "switch2": "UK"
        },
        {
            "time": "2015-04-29T07:13:21.4370000Z",
            "callingimsi": "466923101048691",
            "callingnum1": "678901578",
            "callingnum2": "345626404",
            "switch1": "Germany",
            "switch2": "UK"
        }
    ]
    

JsonFormat の例

ケース 1:JSON ファイルからのデータのコピー

JSON ファイルからデータをコピーするときは、次の 2 つのサンプルを参照してください。 全般的な注意点は次のとおりです。

サンプル 1: オブジェクトと配列からデータを抽出する

このサンプルでは、1 つのルート JSON オブジェクトが表形式の結果の 1 つのレコードにマップされることを想定しています。 次の内容が含まれる JSON ファイルをお持ちで、

{
    "id": "ed0e4960-d9c5-11e6-85dc-d7996816aad3",
    "context": {
        "device": {
            "type": "PC"
        },
        "custom": {
            "dimensions": [
                {
                    "TargetResourceType": "Microsoft.Compute/virtualMachines"
                },
                {
                    "ResourceManagementProcessRunId": "827f8aaa-ab72-437c-ba48-d8917a7336a3"
                },
                {
                    "OccurrenceTime": "1/13/2017 11:24:37 AM"
                }
            ]
        }
    }
}

オブジェクトと配列両方からデータを抽出することで、上記の内容を次の形式の Azure SQL テーブルにコピーします。

id deviceType targetResourceType resourceManagementProcessRunId occurrenceTime
ed0e4960-d9c5-11e6-85dc-d7996816aad3 PC Microsoft.Compute/virtualMachines 827f8aaa-ab72-437c-ba48-d8917a7336a3 1/13/2017 11:24:37 AM

JsonFormat 型の入力データセットは次のように定義されます (関連する部分のみでの部分的な定義)。 具体的には次のとおりです。

  • structure セクションでは、表形式データへの変換中に、カスタマイズされた列名と、対応するデータ型を定義します。 このセクションは、列マッピングを行う必要がない場合は省略可能です。 詳しくは、「ソース データセット列を変換先のデータセット列にマップする」をご覧ください。
  • jsonPathDefinition は、データを抽出する位置を示す各列の JSON のパスを指定します。 配列からデータをコピーするには、array[x].property を使用して x 番目のオブジェクトから特定のプロパティの値を抽出するか、array[*].property を使用してこのようなプロパティを含むオブジェクトから値を見つけることができます。
"properties": {
    "structure": [
        {
            "name": "id",
            "type": "String"
        },
        {
            "name": "deviceType",
            "type": "String"
        },
        {
            "name": "targetResourceType",
            "type": "String"
        },
        {
            "name": "resourceManagementProcessRunId",
            "type": "String"
        },
        {
            "name": "occurrenceTime",
            "type": "DateTime"
        }
    ],
    "typeProperties": {
        "folderPath": "mycontainer/myfolder",
        "format": {
            "type": "JsonFormat",
            "filePattern": "setOfObjects",
            "jsonPathDefinition": {"id": "$.id", "deviceType": "$.context.device.type", "targetResourceType": "$.context.custom.dimensions[0].TargetResourceType", "resourceManagementProcessRunId": "$.context.custom.dimensions[1].ResourceManagementProcessRunId", "occurrenceTime": " $.context.custom.dimensions[2].OccurrenceTime"}      
        }
    }
}

サンプル 2: 同じパターンの複数のオブジェクトを配列からクロス適用する

このサンプルでは、表形式の結果において 1 つのルート JSON オブジェクトを複数のレコードに変換することを想定しています。 次の内容が含まれる JSON ファイルをお持ちで、

{
    "ordernumber": "01",
    "orderdate": "20170122",
    "orderlines": [
        {
            "prod": "p1",
            "price": 23
        },
        {
            "prod": "p2",
            "price": 13
        },
        {
            "prod": "p3",
            "price": 231
        }
    ],
    "city": [ { "sanmateo": "No 1" } ]
}

配列内のデータをフラット化し、共通のルート情報とクロス結合させることで Azure SQL テーブルに次の形式でコピーする場合:

ordernumber orderdate order_pd order_price city
01 20170122 P1 23 [{"sanmateo":"No 1"}]
01 20170122 P2 13 [{"sanmateo":"No 1"}]
01 20170122 P3 231 [{"sanmateo":"No 1"}]

JsonFormat 型の入力データセットは次のように定義されます (関連する部分のみでの部分的な定義)。 具体的には次のとおりです。

  • structure セクションでは、表形式データへの変換中に、カスタマイズされた列名と、対応するデータ型を定義します。 このセクションは、列マッピングを行う必要がない場合は省略可能です。 詳しくは、「ソース データセット列を変換先のデータセット列にマップする」をご覧ください。
  • jsonNodeReference は、orderlines という配列の直下にある同じパターンのオブジェクトからのデータの反復処理と抽出を行うことを示します。
  • jsonPathDefinition は、データを抽出する位置を示す各列の JSON のパスを指定します。 この例での "ordernumber"、"orderdate"、"city" は、"$." から始まる JSON のパスが含まれるルート オブジェクトの直下にあります。"order_pd" と "order_price" は、"$." のない配列要素から派生したパスで定義されています。
"properties": {
    "structure": [
        {
            "name": "ordernumber",
            "type": "String"
        },
        {
            "name": "orderdate",
            "type": "String"
        },
        {
            "name": "order_pd",
            "type": "String"
        },
        {
            "name": "order_price",
            "type": "Int64"
        },
        {
            "name": "city",
            "type": "String"
        }
    ],
    "typeProperties": {
        "folderPath": "mycontainer/myfolder",
        "format": {
            "type": "JsonFormat",
            "filePattern": "setOfObjects",
            "jsonNodeReference": "$.orderlines",
            "jsonPathDefinition": {"ordernumber": "$.ordernumber", "orderdate": "$.orderdate", "order_pd": "prod", "order_price": "price", "city": " $.city"}         
        }
    }
}

以下の点に注意してください。

  • structurejsonPathDefinition が Data Factory データセット内で定義されていない場合、コピー アクティビティでは最初のオブジェクトからスキーマを検出し、オブジェクト全体をフラット化します。
  • JSON 入力に配列がある場合、コピー アクティビティは既定で配列値全体を文字列に変換します。 jsonNodeReferencejsonPathDefinition の両方またはどちらかからデータを抽出するか、jsonPathDefinition でこれを指定せずにスキップすることが可能です。
  • 同じレベルに重複する名前がある場合、コピー アクティビティでは最後の 1 つが選択されます。
  • プロパティ名では大文字と小文字が区別されます。 名前は同じでも大文字小文字が異なる 2 つのプロパティは、2 つの個別のプロパティとして扱われます。

ケース 2:JSON ファイルへのデータの書き込み

SQL Database 内に次のテーブルが含まれているとします。

id order_date order_price order_by
1 20170119 2000 David
2 20170120 3500 Patrick
3 20170121 4000 Jason

また、レコードごとに、次の形式で JSON オブジェクトに書き込みます。

{
    "id": "1",
    "order": {
        "date": "20170119",
        "price": 2000,
        "customer": "David"
    }
}

JsonFormat 型の出力データセットは次のように定義されます (関連する部分のみでの部分的な定義)。 具体的には、structure セクションでは、目的のファイル内のカスタマイズされたプロパティ名を定義します。nestingSeparator (既定では ".") は、入れ子のレイヤーを名前から識別するために使用されます。 このセクションは、ソース列名と比較してプロパティ名を変更したり、一部のプロパティを入れ子にしたりする必要がない場合は省略可能です。

"properties": {
    "structure": [
        {
            "name": "id",
            "type": "String"
        },
        {
            "name": "order.date",
            "type": "String"
        },
        {
            "name": "order.price",
            "type": "Int64"
        },
        {
            "name": "order.customer",
            "type": "String"
        }
    ],
    "typeProperties": {
        "folderPath": "mycontainer/myfolder",
        "format": {
            "type": "JsonFormat"
        }
    }
}

AVRO 形式

Avro ファイルを解析するか、Avro 形式でデータを書き込む場合は、formattype プロパティを AvroFormat に設定します。 typeProperties セクション内の Format セクションにプロパティを指定する必要はありません。 例:

"format":
{
    "type": "AvroFormat",
}

Hive テーブルで Avro 形式を使用するには、Apache Hive のチュートリアルを参照してください。

以下の点に注意してください。

  • 複合データ型はサポートされていません (レコード、列挙型、配列、マップ、共用体、および固定)。

ORC 形式

ORC ファイルを解析するか、ORC 形式でデータを書き込む場合は、formattype プロパティを OrcFormat に設定します。 typeProperties セクション内の Format セクションにプロパティを指定する必要はありません。 例:

"format":
{
    "type": "OrcFormat"
}

重要

ORC ファイルを、オンプレミス データ ストアとクラウド データ ストア間で そのまま コピーしない場合は、JRE 8 (Java Runtime Environment) をゲートウェイ マシンにインストールする必要があります。 64 ビットのゲートウェイでは 64 ビットの JRE が必要になり、32 ビットのゲートウェイでは 32 ビットの JRE が必要になります。 どちらのバージョンも こちらのページで入手できます。 適切なバージョンを選択してください。

以下の点に注意してください。

  • 複雑なデータ型はサポートされていません (STRUCT、MAP、LIST、UNION)。
  • ORC ファイルには、圧縮関連のオプションとして、NONE、ZLIB、SNAPPY の 3 つがあります。 Data Factory では、これらすべての圧縮形式の ORC ファイルからデータを読み取ることができます。 データの読み取りには、メタデータ内の圧縮コーデックが使用されます。 ただし、Data Factory で ORC ファイルに書き込むときは、ORC の既定の動作である ZLIB が選択されます。 現時点でこの動作をオーバーライドするオプションはありません。

Parquet 形式

Parquet ファイルを解析するか、Parquet 形式でデータを書き込む場合は、formattype プロパティを ParquetFormat に設定します。 typeProperties セクション内の Format セクションにプロパティを指定する必要はありません。 例:

"format":
{
    "type": "ParquetFormat"
}

重要

Parquet ファイルを、オンプレミス データ ストアとクラウド データ ストア間で そのまま コピーしない場合は、JRE 8 (Java Runtime Environment) をゲートウェイ マシンにインストールする必要があります。 64 ビットのゲートウェイでは 64 ビットの JRE が必要になり、32 ビットのゲートウェイでは 32 ビットの JRE が必要になります。 どちらのバージョンも こちらのページで入手できます。 適切なバージョンを選択してください。

以下の点に注意してください。

  • 複雑なデータ型はサポートされていません (MAP、LIST)。
  • Parquet ファイルには、圧縮関連のオプションとして、NONE、SNAPPY、GZIP、LZO があります。 Data Factory では、これらすべての圧縮形式の ORC ファイルからデータを読み取ることができます。 データの読み取りには、メタデータ内の圧縮コーデックが使用されます。 ただし、Data Factory で Parquet ファイルに書き込むときは、Parquet 形式の既定の動作である SNAPPY が選択されます。 現時点でこの動作をオーバーライドするオプションはありません。

圧縮のサポート

大量のデータセットを処理すると、I/O およびネットワークにボトルネックが生じる可能性があります。 そのため、データを圧縮して保存すると、ネットワークでのデータ転送速度が上昇してディスク領域を節約できるだけでなく、ビッグ データの処理性能を大幅に高めることができます。 現時点では、圧縮は Azure BLOB やオンプレミスのファイル システムなど、ファイルベースのデータ ストアでサポートされています。

データセットの圧縮を指定するには、次の例のように、データセットの JSON で compression プロパティを使用します。

{  
    "name": "AzureBlobDataSet",  
    "properties": {  
        "availability": {  
            "frequency": "Day",  
              "interval": 1  
        },  
        "type": "AzureBlob",  
        "linkedServiceName": "StorageLinkedService",  
        "typeProperties": {  
            "fileName": "pagecounts.csv.gz",  
            "folderPath": "compression/file/",  
            "compression": {  
                "type": "GZip",  
                "level": "Optimal"  
            }  
        }  
    }  
}  

サンプル データセットをコピー アクティビティの出力として使用し、コピー アクティビティで出力データを GZIP コーデックによって最適な圧縮率で圧縮してから、Azure Blob Storage の pagecounts.csv.gz という名前のファイルに圧縮データを書き込む場合を考えます。

注意

AvroFormatOrcFormat、および ParquetFormat のデータの圧縮設定はサポートされていません。 こうした形式でファイルを読み取るとき、Data Factory は、メタデータ内の圧縮コーデックを検出して使用します。 ファイルに書き込むときは、その形式の既定の圧縮コーデックを選択します。 たとえば、OrcFormat には ZLIB、ParquetFormat には SNAPPY が選択されます。

compression セクションには次の 2 つのプロパティがあります。

  • Type: 圧縮コーデックです。GZIPDeflateBZIP2、または ZipDeflate を選択できます。

  • level: 圧縮率です。Optimal または Fastest を指定できます。

    • Fastest: 圧縮操作は可能な限り短時間で完了しますが、圧縮後のファイルが最適に圧縮されていない場合があります。

    • Optimal:圧縮操作で最適に圧縮されますが、操作が完了するまでに時間がかかる場合があります。

      詳細については、 圧縮レベル に関するトピックをご覧ください。

compression プロパティを入力データセットの JSON で指定すると、パイプラインでソースから圧縮データを読み取ることができます。このプロパティを出力データセットの JSON で指定すると、コピー アクティビティにより出力先に圧縮データを書き込むことができます。 いくつかのサンプル シナリオを次に示します。

  • Azure BLOB から GZIP 圧縮データを読み取って展開し、生成されたデータを Azure SQL Database に書き込みます。 compressiontype JSON プロパティを使用して、Azure BLOB 入力データセットを GZIP として定義します。
  • オンプレミスのファイル システムのプレーンテキスト ファイルからデータを読み取り、GZip 形式で圧縮して、圧縮データを Azure BLOB に書き込みます。 compressiontype JSON プロパティを使用して、Azure BLOB 出力データセットを GZip として定義します。
  • FTP サーバーから .zip ファイルを読み取り、圧縮解除して中にあるファイルを取得し、それらのファイルを Azure Data Lake Store に格納します。 compressiontype JSON プロパティを使用して、FTP 入力データセットを ZipDeflate として定義します。
  • Azure BLOB から GZIP 圧縮データを読み取って展開し、BZIP2 で圧縮して、生成されたデータを Azure BLOB に書き込みます。 この場合、Azure BLOB 入力データセットは compressiontype を GZIP に設定して定義し、Azure BLOB 出力データセットは compressiontype を BZIP2 に設定して定義します。

次のステップ

Azure Data Factory でサポートされるファイル ベースのデータ ストアについては、次の記事を参照してください。