Introduction to loading semi-structured data¶
このトピックでは、半構造化データについて説明し、Snowflakeにデータをロードして格納する方法にかかわる情報を提供します。
About semi-structured data¶
半構造化データは、従来の構造化データの標準に準拠していないデータですが、データ内の個々の異なるエンティティを識別するタグ(ラベル)またはその他の型のマークアップを含んでいます。
半構造化データと構造化データを区別する2つの重要な属性は、ネストされたデータ構造と固定スキーマの欠如です。
構造化データには、リレーショナルデータベースシステムでデータをロードしてクエリする前に定義された固定スキーマが必要です。半構造化データは、スキーマの事前定義を必要とせず、常に進化させられます(つまり、いつでも新しい属性を追加できます)。
さらに、同じクラス内のエンティティは、グループ化されていても異なる属性を持つ場合があり、属性の順序は重要ではありません。
データをフラットテーブルとして表す構造化データとは異なり、半構造化データには、ネストされた情報のNレベルの階層を含めることができます。
About hierarchical data¶
半構造化データは通常、階層に編成されています。複雑なデータ構造は、 配列 や オブジェクト などのより単純なデータ型をネストすることで構築できます。(注:Snowflake OBJECT は、「ディクショナリ」または「マップ」に対応します。Snowflakeオブジェクトは、「オブジェクト指向プログラミング」という意味での「オブジェクト」ではありません。)
たとえば、 JSON データには配列を含むオブジェクトを含めることができます。その配列の各セルには、ネストされたオブジェクトまたは配列が含まれている場合があります。
Snowflakeデータ型を使用すると、データ型の次のプロパティを使用して、半構造化データを保持する階層を構築できます。
VARIANT は、 ARRAY や OBJECT など、他のデータ型の値を保持できます。
ARRAY または OBJECT は、型 VARIANT の値を保持します。
たとえば、さまざまな種類の自然災害が発生した日付を格納するとします。「ハリケーン」、「地震」、「洪水」などのキーを含む OBJECT を作成できます。これらの各キーに関連付けられている値は、各種の災害が発生した日付を含む ARRAY にすることができます。各キーと値のペアの値は VARIANT である必要があるため、日付の各配列は、対応する OBJECT 内の VARIANT 内にラップされた ARRAY として格納されます。階層の最上位は次のようになります(中括弧は OBJECT を示し、キーと値のペアが含まれます)。
{
"Flood": flood_date_array::VARIANT,
"Earthquake": earthquake_date_array::VARIANT,
...
}
別の例として、災害の単一リストを時系列で格納するとします。その場合、外部データ型は ARRAY である可能性があります。その ARRAY の各セルには、イベントに関する情報を含むキーと値のペアを含む OBJECT (VARIANT でラップされている)が含まれている場合があります。たとえば、地震を表す各 OBJECT には、「タイムスタンプ」、「場所」、「マグニチュード」などのキーがあります。竜巻を表す各 OBJECT には、「タイムスタンプ」や「最大風速」などのキーが含まれている場合があります。
[
{
"Event_ID": 54::VARIANT,
"Type": "Earthquake"::VARIANT,
"Magnitude": 7.4::VARIANT,
"Timestamp": "2018-06-09 12:32:15"::TIMESTAMP_LTZ::VARIANT
...
}::VARIANT,
{
"Event_ID": 55::VARIANT,
"Type": "Tornado"::VARIANT,
"Maximum_wind_speed": 186::VARIANT,
"Timestamp": "2018-07-01 09:42:55"::TIMESTAMP_LTZ::VARIANT
...
}::VARIANT
]
ほぼすべての深さまたは幅のデータ階層を作成できます(各データ型のストレージの制限まで)。たとえば、竜巻に関する情報を含む OBJECT には、竜巻発生中のさまざまな時点での風速に関する情報が必要な場合があるため、データ構造は次のようになります。
最上位は ARRAY です。
その ARRAY の各セルには、1つの竜巻を表す1つの OBJECT が含まれています。
各 OBJECT には、 ARRAY の風速データが含まれています。
その内側の ARRAY の各セルは、次のようなキーを持つデータを含む OBJECT です。
風速のタイムスタンプ。
風速の場所。
KPH (キロメートル/時)単位の風速。
場合によっては、データが不完全である可能性があります。たとえば、特定の場所での風速を竜巻の後(竜巻発生中に直接測定されるのではなく)に見える損傷に基づいて推定した場合、データには場所と風速が含まれる可能性がありますが、タイムスタンプは含まれません。
Load semi-structured data¶
Snowflakeは、 JSON、Avro、 ORC、Parquet、および XML 形式から半構造化データをインポートし、 半構造化データをサポートするように特別に設計されたSnowflakeデータ型 に格納できます。
データの構造、データのサイズ、およびユーザーがデータをインポートする方法に応じて、半構造化データを1つの列に格納することも、複数の列に分割することもできます。
半構造化データをテーブルにロードするステップは、構造化データをテーブルにロードする場合と類似しています。ただし、半構造化データをロードして格納する場合は、構造のすべてか一部を指定するか、まったく指定しないこともできます。
データがキーと値のペアのセットである場合は、型 OBJECT の列にデータをロードできます。
データが配列の場合は、型 ARRAY の列にデータをロードできます。
階層データ がある場合は、次のいずれかを実行できます。
データを複数の列に分割します。できること:
型 VARIANT の単一の列にデータを格納します。できること:
構造を明示的に指定します(例: VARIANT、 ARRAY、および OBJECT データ型の階層を指定します)。
構造を明示的に指定せずにデータをロードします。Snowflakeが認識して解析するデータ形式(JSON、Avro、Parquet、または ORC)を指定すると、データはSnowflake VARIANT、 ARRAY、および OBJECT データ型を使用する内部データ形式に変換されます。
データが複雑な場合、または個々の値に約128MB を超えるストレージスペースが必要な場合は、前述の手法を複数使用できます。たとえば、データは複数の列に分割でき、それらの列の一部には、明示的に指定されたデータ型の階層を含めることができます。
半構造化データは、次の方法でロードできます。
テーブルの作成中およびデータのロード中に、入力データ形式とSnowflakeデータ型を指定します。たとえば、次のコードでは、 VARIANT データ型は CREATE TABLE ステートメントで指定され、 JSON 入力データ形式は COPY INTO <テーブル> コマンドの
TYPE = <データ形式>句で指定されています。CREATE TABLE my_table (my_variant_column VARIANT); COPY INTO my_table ... FILE FORMAT = (TYPE = 'JSON') ...
データを変換するために適切な関数を呼び出して、入力データ形式とSnowflakeデータ型を指定します。たとえば、 JSON 形式のデータを VARIANT 値に変換するには、次のように PARSE_JSON を呼び出します。
INSERT INTO my_table (my_variant_column) SELECT PARSE_JSON('{...}');
データが ARRAY、 OBJECT、 VARIANT データ型、またはこれらの型の階層に格納されている場合は、 クエリ を実行できます。
Store semi-structured data¶
半構造化データは通常、次のSnowflakeデータ型で格納されます。
ARRAY: 他の言語の配列に似ています。
OBJECT: JSON オブジェクトに似ており、多くの言語で「ディクショナリ」、「ハッシュ」、または「マップ」とも呼ばれます。これには、キーと値のペアが含まれます。
VARIANT: 他のデータ型(ARRAY および OBJECT を含む)の値を保持できるデータ型。VARIANT 階層データ を構築および格納するために使用されます。
(インポートしたデータが、格納前に複数の列に分割されている場合は、それらの列の一部またはすべてを FLOAT、 VARCHAR などの単純なデータ型にすることができます。)
ARRAY、 OBJECT、および VARIANT データ型は、個別に使用することも、ネストして階層を構築することもできます。
データが JSON、Avro、 ORC、またはParquet形式でインポートされる場合、Snowflakeは階層を構築し、それを VARIANT に格納できます。手動で階層を作成することもできます。
階層がどのように構築されたかに関係なく、Snowflakeは、データを ARRAY、 OBJECT、および VARIANT を使用する最適化された内部ストレージ形式に変換します。この内部ストレージ形式は、高速で効率的な SQL クエリをサポートします。
Query semi-structured data¶
Snowflakeは、次の演算子をサポートしています。
半構造化データのクエリの詳細については、 半構造化データのクエリ をご参照ください。
XML タグを指定して XML をクエリする方法については、 XMLGET 関数のドキュメントをご参照ください。