半構造化データでサポートされている形式

このトピックでは、半構造化データでサポートされている形式について説明します。

このトピックの内容:

Snowflakeは、以下の半構造化データ形式をネイティブでサポートしています。具体的には、Snowflakeは、これらの形式のデータファイルをロードおよびアンロードするためのオプションを COPY コマンドで提供します。

JSON

JSON とは何ですか?

JSON (JavaScript Object Notation)は、JavaScript プログラミング言語のサブセットに基づいた、軽量でプレーンテキストのデータ交換形式です。

JSON データはどのアプリケーションでも生成できます。一般的な例を次に示します。

  • JavaScript ネイティブメソッドを使用して JSON を生成するアプリケーション。

  • ライブラリ(通常は拡張機能を使用)を使用して JSON データを生成する非 JavaScript アプリケーション。

  • アドホック JavaScript ジェネレーター。

  • JSON ドキュメントの連結(行区切りの場合とそうでない場合があります)。

正式な仕様がないため、実装が異なると大きな違いがあります。これらの違いにより、JSON パーサーの言語定義が厳密な場合、JSON のようなデータセットのインポートは不可能になります。できるだけ問題なく JSON データセットのインポートを行うために、Snowflakeは「受け入れるものに寛容であること」というルールに従います。これは、明確な解釈を可能にする JSON および JSON のような入力の可能な限り広い範囲を受け入れることを意図しています。

このトピックでは、Snowflakeで受け入れる JSON ドキュメントの構文について説明します。

JSON の詳細については、 json.org をご参照ください。

基本的な JSON 構文

JSON データは、オブジェクトと配列にグループ化された名前/値のペアの階層的なコレクションです。

  • コロン : は、名前と値のペアで名前と値を区切ります。

  • 中括弧 {} はオブジェクトを示します。

  • 角括弧 [] は配列を示します。

  • コンマ , は、オブジェクトと配列内のエンティティを区切ります。

名前/値のペア

JSON 名前/値のペアは、フィールド名(二重引用符で囲まれた)、コロン、値から構成されます。

例:

{"firstName":"John", "empid":45611}
Copy

サポートされているデータ型

名前/値のペアの値は次のいずれかです。

  • 数値(整数または浮動小数点)

  • 文字列(二重引用符内)

  • ブール値(trueまたはfalse)

  • 配列(角括弧内)

  • オブジェクト(中括弧内)

  • Null

オブジェクト

JSON オブジェクトは中括弧内に書き込みます。オブジェクトには、コンマで区切られた複数の名前/値のペアを含めることができます。例:

{"firstName":"John", "lastName":"Doe"}
Copy

配列

JSON 配列は角括弧内に書き込みます。配列には、コンマで区切られた複数のオブジェクトを含めることができます。例:

{"employees":[
    {"firstName":"John", "lastName":"Doe"},
    {"firstName":"Anna", "lastName":"Smith"},
    {"firstName":"Peter", "lastName":"Jones"}
  ]
}
Copy

JSON ドキュメントの例

FILE NAME: json_sample_data1

3つの単純な従業員記録(オブジェクト)の配列が含まれます。

{"root":[{"employees":[
    {"firstName":"John", "lastName":"Doe"},
    {"firstName":"Anna", "lastName":"Smith"},
    {"firstName":"Peter", "lastName":"Jones"}
]}]}
Copy

FILE NAME: json_sample_data2

3つの従業員記録(オブジェクト)とそれに関連する依存データ(子供、子供の名前と年齢、従業員の居住都市、従業員のその都市における居住年数)を含む配列が含まれます。

{"root":
   [
    { "kind": "person",
      "fullName": "John Doe",
      "age": 22,
      "gender": "Male",
      "phoneNumber":
        {"areaCode": "206",
         "number": "1234567"},
      "children":
         [
           {
             "name": "Jane",
             "gender": "Female",
             "age": "6"
           },
           {
              "name": "John",
              "gender": "Male",
              "age": "15"
           }
         ],
      "citiesLived":
         [
            {
               "place": "Seattle",
               "yearsLived": ["1995"]
            },
            {
               "place": "Stockholm",
               "yearsLived": ["2005"]
            }
         ]
      },
      {"kind": "person", "fullName": "Mike Jones", "age": 35, "gender": "Male", "phoneNumber": { "areaCode": "622", "number": "1567845"}, "children": [{ "name": "Earl", "gender": "Male", "age": "10"}, {"name": "Sam", "gender": "Male", "age": "6"}, { "name": "Kit", "gender": "Male", "age": "8"}], "citiesLived": [{"place": "Los Angeles", "yearsLived": ["1989", "1993", "1998", "2002"]}, {"place": "Washington DC", "yearsLived": ["1990", "1993", "1998", "2008"]}, {"place": "Portland", "yearsLived": ["1993", "1998", "2003", "2005"]}, {"place": "Austin", "yearsLived": ["1973", "1998", "2001", "2005"]}]},
      {"kind": "person", "fullName": "Anna Karenina", "age": 45, "gender": "Female", "phoneNumber": { "areaCode": "425", "number": "1984783"}, "citiesLived": [{"place": "Stockholm", "yearsLived": ["1992", "1998", "2000", "2010"]}, {"place": "Russia", "yearsLived": ["1998", "2001", "2005"]}, {"place": "Austin", "yearsLived": ["1995", "1999"]}]}
    ]
}
Copy

Avro

Avroとは何ですか?

Avroは、Apache Hadoopと併用するために開発されたオープンソースのデータシリアル化および RPC フレームワークです。JSON で定義されたスキーマを利用して、シリアル化されたデータをコンパクトなバイナリ形式で生成します。シリアル化されたデータは任意の宛先(アプリケーションまたはプログラム)に送信でき、スキーマがデータに含まれているため、宛先で簡単に逆シリアル化できます。

Avroスキーマは、スキーマのタイプとスキーマタイプのデータ属性(フィールド名、データタイプなど)を定義する JSON 文字列、オブジェクト、または配列で構成されます。属性は、スキーマタイプによって異なります。配列やマップなどの複雑なデータ型がサポートされています。

Snowflakeは、Avroデータを単一の VARIANT 列に読み取ります。同様のコマンドと関数を使用して、 JSON データと同様に VARIANT 列のデータをクエリできます。

詳細については、 avro.apache.org をご参照ください。

Avroスキーマの例

{
 "type": "record",
 "name": "person",
 "namespace": "example.avro",
 "fields": [
     {"name": "fullName", "type": "string"},
     {"name": "age",  "type": ["int", "null"]},
     {"name": "gender", "type": ["string", "null"]}
     ]
}
Copy

ORC

ORC とは何ですか?

ORC (最適化された行の列指向)は、Hiveデータを格納するために使用されるバイナリ形式です。ORC は、効率的な圧縮と、以前のHiveファイル形式によるデータの読み取り、書き込み、処理のパフォーマンス向上のために設計されています。ORC の詳細については、 https://orc.apache.org/ をご参照ください。

Snowflakeは ORC データを単一の VARIANT 列に読み取ります。同様のコマンドと関数を使用して、 JSON データと同様に VARIANT 列のデータをクエリできます。

または、 CREATE TABLE AS SELECT ステートメントを使用して、ステージングされた ORC ファイルから列を個別のテーブル列に抽出できます。

注釈

  • マップデータは、オブジェクトの配列に逆シリアル化されます。例:

    "map": [{"key": "chani", "value": {"int1": 5, "string1": "chani"}}, {"key": "mauddib", "value": {"int1": 1, "string1": "mauddib"}}]
    
    Copy
  • ユニオンデータは単一のオブジェクトに逆シリアル化されます。例:

    {"time": "1970-05-05 12:34:56.197", "union": {"tag": 0, "value": 3880900}, "decimal": 3863316326626557453.000000000000000000}
    
    Copy

VARIANT 列にロードされた ORC データの例

+--------------------------------------+
| SRC                                  |
|--------------------------------------|
| {                                    |
|   "boolean1": false,                 |
|   "byte1": 1,                        |
|   "bytes1": "0001020304",            |
|   "decimal1": 12345678.654745,       |
|   "double1": -1.500000000000000e+01, |
|   "float1": 1.000000000000000e+00,   |
|   "int1": 65536,                     |
|   "list": [                          |
|     {                                |
|       "int1": 3,                     |
|       "string1": "good"              |
|     },                               |
|     {                                |
|       "int1": 4,                     |
|       "string1": "bad"               |
|     }                                |
|   ]                                  |
| }                                    |
+--------------------------------------+
Copy

Parquet

Parquetとは何ですか?

Parquetは、Hadoopエコシステムのプロジェクト用に設計された、圧縮された効率的な列指向データ表現です。このファイル形式は、ネストされた複雑なデータ構造をサポートし、Dremel記録シュレッディングおよびアセンブリアルゴリズムを使用します。詳細は parquet.apache.org/docs/ をご参照ください。

注釈

現在Snowflakeは、Parquetライターv1を使用して作成されたParquetファイルのスキーマをサポートしています。ライターのv2を使用して作成されたファイルは、データのロードをサポートしていません。

SnowflakeはParquetデータを単一の VARIANT 列に読み取ります。同様のコマンドと関数を使用して、 JSON データと同様に VARIANT 列のデータをクエリできます。

または、CREATE TABLE AS SELECT ステートメントを使用して、ステージングされたParquetファイルから選択した列を個別のテーブル列に抽出できます。

Parquetはバイナリ形式です。Parquetファイルの例を提供することはできません。

VARIANT 列にロードされたParquetデータの例

+------------------------------------------+
| SRC                                      |
|------------------------------------------|
| {                                        |
|   "continent": "Europe",                 |
|   "country": {                           |
|     "city": {                            |
|       "bag": [                           |
|         {                                |
|           "array_element": "Paris"       |
|         },                               |
|         {                                |
|           "array_element": "Nice"        |
|         },                               |
|         {                                |
|           "array_element": "Marseilles"  |
|         },                               |
|         {                                |
|           "array_element": "Cannes"      |
|         }                                |
|       ]                                  |
|     },                                   |
|     "name": "France"                     |
|   }                                      |
| }                                        |
+------------------------------------------+
Copy

XML

XML とは何ですか?

XML (拡張マークアップ言語)は、ドキュメントをエンコードするための一連のルールを定義するマークアップ言語です。当初は、ドキュメントを構成する構造と要素を標準化するために開発された別のマークアップ言語である SGML に基づいていました。

導入以来、XML は当初のドキュメントに対する焦点を超えて成長し、任意のデータ構造の表現や通信プロトコルのベース言語としての機能など、幅広い用途を網羅しています。拡張性、汎用性、使いやすさから、ウェブでのデータ交換で最もよく使用される標準の1つになりました。

XML ドキュメントは、主に次の構成要素で構成されます。

  • タグ(山括弧 < および > で識別)

  • 要素

通常、要素は「開始」タグとそれに対応する「終了」タグで構成され、タグ間のテキストが要素のコンテンツを構成します。要素は、「終了」タグのない「空要素」タグで構成することもできます。 「開始」および「空要素」タグには、要素の特性またはメタデータの定義に役立つ属性が含まれる場合があります。

XML ドキュメントの例

<?xml version="1.0"?>
<!DOCTYPE parts system "parts.dtd">
<?xml-stylesheet type="text/css" href="xmlpartsstyle.css"?>
<parts>
   <title>Automobile Parts &amp; Accessories</title>
   <part>
      <item>Spark Plugs</item>
      <partnum>A3-400</partnum>
      <price> 27.00</price>
   </part>
   <part>
      <item>Motor Oil</item>
      <partnum>B5-200</partnum>
      <price> 14.00</price>
   </part>
   <part>
      <item>Motor Oil</item>
      <partnum>B5-300</partnum>
      <price> 16.75</price>
   </part>
   <part>
      <item>Engine Coolant</item>
      <partnum>B6-120</partnum>
      <price> 19.00</price>
   </part>
   <part>
      <item>Engine Coolant</item>
      <partnum>B6-220</partnum>
      <price> 18.25</price>
   </part>
</parts>
Copy