半構造化データの概要

半構造化データは、従来の構造化データの標準に準拠していないデータですが、データ内の個々の異なるエンティティを識別するタグまたはその他のタイプのマークアップが含まれています。

半構造化データと構造化データを区別する2つの重要な属性は、ネストされたデータ構造と固定スキーマの欠如です。

  • 構造化データには、リレーショナルデータベースシステムでデータをロードしてクエリする前に定義された固定スキーマが必要です。半構造化データは、スキーマの事前定義を必要とせず、常に進化できるため、いつでも新しい属性を追加できます。

    さらに、同じクラス内のエンティティは、グループ化されていても異なる属性を持つ場合があり、属性の順序は重要ではありません。

  • データをフラットテーブルとして表す構造化データとは異なり、半構造化データには、ネストされた情報のnレベルの階層を含めることができます。

このトピックの内容:

半構造化データのロード

半構造化データをテーブルにロードする手順は、構造化データをリレーショナルテーブルにロードする手順と同じです。

Snowflakeは、半構造化データを単一の VARIANT 列にロードします。または、 データ変換 で COPY INTO テーブルステートメントを使用して、ステージングされたデータファイルから選択した列を個別のテーブル列に抽出できます。

サポートされているファイル形式

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}

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

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

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

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

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

  • 配列(角括弧内)

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

  • Null

オブジェクト

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

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

配列

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

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

JSON ドキュメントの例

FILE NAME: json_sample_data1

3の単純な従業員レコード(オブジェクト)の配列が含まれます。

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

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"]}]}
    ]
}

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"]}
     ]
}

ORC とは何ですか?

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

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

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

ORC はバイナリ形式です。

注釈

  • ORC バイナリ列と文字列列の最大長は、 VARCHAR データ(圧縮)のSnowflake 16 MB 制限に従います。

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

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

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

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"               |
|     }                                |
|   ]                                  |
| }                                    |
+--------------------------------------+

Parquetとは何ですか?

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

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"                     |
|   }                                      |
| }                                        |
+------------------------------------------+

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>