すべてのプロダクト
Search
ドキュメントセンター

E-MapReduce:JSON データの Doris へのインポート

最終更新日:Jan 11, 2025

Doris では JSON データをインポートできます。このトピックでは、JSON データを Doris にインポートする際に使用されるパラメーターと使用上の注意について説明します。

サポートされているインポート方法

JSON データのインポートには、次のインポート方法のみを使用できます。

説明

他のインポート方法を使用して JSON データをインポートすることはできません。

サポートされている JSON 形式

次の 2 つの JSON 形式のみがサポートされています。

  • 配列で表される複数行のデータ

    配列がルートノードとして使用される JSON 形式。配列内の各要素は、インポートされるデータの行(通常はオブジェクト)を表します。例:

    [
        { "id": 123, "city" : "beijing"},
        { "id": 456, "city" : "shanghai"},
        ...
    ]

    この形式は通常、ストリームロードメソッドで使用され、インポートされるデータのバッチ内の複数行のデータを表します。

    重要

    この形式を使用するには、strip_outer_array パラメーターを true に設定する必要があります。解析中に、Doris は配列を展開し、次に各オブジェクトをデータの行として順番に解析します。

  • オブジェクトで表される単一行のデータ

    オブジェクトがルートノードとして使用される JSON 形式。オブジェクト全体が、インポートされるデータの行を表します。例:

    { "id": 123, "city" : "beijing"}
    { "id": 123, "city" : { "name" : "beijing", "region" : "haidian" }}

    この形式は通常、ルーチンロードメソッドで使用されます。たとえば、この形式は Kafka のメッセージ(データの行)を表すことができます。

  • 固定区切り文字で区切られた複数行のオブジェクトデータ

    オブジェクトによって表されるデータの行は、インポートされるデータの行を表します。例:

    { "id": 123, "city" : "beijing"}
    { "id": 456, "city" : "shanghai"}
    ...

    この形式は通常、ストリームロードメソッドで使用され、インポートされるデータのバッチ内の複数行のデータを表します。

    重要

    この形式を使用するには、read_json_by_line パラメーターを true に設定する必要があります。また、line_delimiter パラメーターを構成して区切り文字を指定する必要があります。デフォルト値:\n。Doris がオブジェクトを解析するとき、オブジェクトは指定された区切り文字で区切られます。オブジェクトの各行はデータの行として解析されます。

JSON パラメーター

  • streaming_load_json_max_mb

    • JSON などの一部の形式のデータは分割できません。Doris は、これらの形式のすべてのデータを読み込んでメモリにインポートしてからでないと、データを解析できません。したがって、このパラメーターは、これらの形式のデータを 1 回のストリームロードでインポートできる最大量を指定するために使用されます。

    • デフォルト値:100。単位:MB。このパラメーターの変更方法の詳細については、「[バックエンドノードの構成項目]」をご参照ください。

  • fuzzy_parse

    • ストリームロードでは、fuzzy_parse パラメーターを追加して、JSON データのインポート効率を向上させることができます。[ストリームロード]

    • このパラメーターは通常、配列で表される複数行のデータをインポートするために使用されます。したがって、このパラメーターを構成する場合は、strip_outer_array パラメーターを true に設定する必要があります。

    • fuzzy_parse パラメーターを使用する場合は、配列内のデータの各行のフィールドの順序が同じであることを確認してください。Doris は最初の行のフィールドの順序のみに基づいてデータを解析し、次に添え字の形式で後続のデータにアクセスします。これにより、インポート効率が 3 ~ 5 倍向上します。

JSON パス

Doris では、JSON パスを指定して、指定された JSON データを抽出できます。

説明

配列内のデータを解析するために、Doris は最初に配列を展開し、次にオブジェクト形式のデータの各行を処理します。したがって、次の例では、単一オブジェクト形式の JSON データが使用されます。

  • JSON パスを指定しない

    JSON パスを指定しない場合、Doris はデフォルトでテーブルの列名に基づいてオブジェクト内の要素を検索します。例:

    このテーブルには、id and city という 2 つの列があります。次のサンプル JSON データを使用できます。

    { "id": 123, "city" : "beijing"}

    Doris は、オブジェクト内の要素を照合するために、id and city 名を使用します。その後、123beijing が取得されます。

    次のサンプル JSON データを使用できます。

    { "id": 123, "name" : "beijing"}

    Doris は、オブジェクト内の要素を照合するために、id and city 名を使用します。その後、123null が取得されます。

  • JSON パスの指定

    JSON データの形式で JSON パスのセットを指定します。配列内の各要素は、抽出される列を表します。例:

    ["$.id", "$.name"]
    ["$.id.sub_id", "$.name[0]", "$.city[0]"]

    Doris は、指定された JSON パスを使用してデータを照合および抽出します。

  • プリミティブデータ型ではないデータ型の照合

    前の例で照合されたデータは、Integer や String などのプリミティブデータ型です。Doris は、Array や Map などの複合データ型をサポートしていません。したがって、プリミティブデータ型ではないデータ型のデータが照合された場合、Doris は型を JSON 形式の文字列に変換し、データを文字列としてインポートします。例:

    次のサンプル JSON データを使用できます。

    { "id": 123, "city" : { "name" : "beijing", "region" : "haidian" }}

    ["$.city"] として JSON パスを指定します。次に、次の要素が照合されます。

    { "name" : "beijing", "region" : "haidian" }

    要素は後続のインポート操作のために文字列に変換されます。

    "{'name':'beijing','region':'haidian'}"
  • 照合失敗

    照合が失敗した場合、null が返されます。例:

    次のサンプル JSON データを使用できます。

    { "id": 123, "name" : "beijing"}

    JSON パスを ["$.id", "$.info"] として指定します。次に、照合された要素は 123null です。

    Doris は、JSON データの null 値と、照合が失敗したときに返される null 値を区別しません。次のサンプル JSON データを使用できます。

    { "id": 123, "name" : null }

    次に、次の 2 つの JSON パスを使用して要素を照合すると、同じ結果(123null)が返されます。

    • ["$.id", "$.name"]
    • ["$.id", "$.info"]
  • 完全一致の失敗

    無効なパラメーター設定によって引き起こされる偶発的な操作を防ぐために、Doris は、データの行の照合を試みたときにすべての列の照合に失敗した場合、データの行をエラー行と見なします。次のサンプル JSON データを使用できます。

    { "id": 123, "city" : "beijing" }

    JSON パスが無効な次の値に指定されている場合、または JSON パスが指定されておらず、id 列と city 列がテーブルに存在しない場合:

    ["$.ad", "$.infa"]

    次に、完全一致が失敗し、Doris は null, null を生成する代わりに、この行をエラー行としてマークします。

JSON パスと列

JSON パスは JSON データの抽出方法を指定するために使用され、列は列のマッピングと変換関係を指定するために使用されます。JSON パスは Columns と一緒に使用できます。

この方法は、JSON パスで指定された列の順序に基づいて、JSON パスの列を並べ替えることと同じです。次に、列を使用して、並べ替えられたソースデータをテーブルの列にマッピングできます。例:

  • データコンテンツ:

    {"k1" : 1, "k2": 2}
  • テーブルスキーマ:

    k2 int, k1 int
  • ストリームロードメソッドが使用されるインポートステートメント 1:

    curl -v --location-trusted -u root: -H "format: json" -H "jsonpaths: [\"$.k2\", \"$.k1\"]" -T example.json http://127.0.0.1:8030/api/db1/tbl1/_stream_load

    インポートステートメント 1 では、JSON パスのみが指定され、columns フィールドは指定されていません。JSON パスは、JSON パスのフィールドの順序に基づいて JSON データを抽出するために使用されます。次に、テーブルスキーマの順序に基づいてデータが書き込まれます。次のデータインポート結果が返されます。

    +------+------+
    | k1   | k2   |
    +------+------+
    |    2 |    1 |
    +------+------+

    JSON データの k2 列の値が k1 列にインポートされていることがわかります。これは、JSON データのフィールドの名前が、テーブルスキーマの対応するフィールドの名前と同じではないためです。したがって、JSON データのフィールドとテーブルスキーマの間のマッピングを明示的に指定する必要があります。

  • インポートステートメント 2:

    curl -v --location-trusted -u root: -H "format: json" -H "jsonpaths: [\"$.k2\", \"$.k1\"]" -H "columns: k2, k1" -T example.json http://127.0.0.1:8030/api/db1/tbl1/_stream_load

    インポートステートメント 1 と比較して、columns フィールドが追加され、k1 列と k2 列の間のマッピングが k2、k1 の順序で記述されています。JSON パスのフィールドが順番に抽出された後、最初の列の値はテーブルの k2 列の値に指定され、2 番目の列の値はテーブルの k1 列の値に指定されます。次のデータインポート結果が返されます。

    +------+------+
    | k1   | k2   |
    +------+------+
    |    1 |    2 |
    +------+------+

    他のインポート方法と同様に、columns フィールドで列変換を実行できます。例:

    curl -v --location-trusted -u root: -H "format: json" -H "jsonpaths: [\"$.k2\", \"$.k1\"]" -H "columns: k2, tmp_k1, k1 = tmp_k1 * 100" -T example.json http://127.0.0.1:8030/api/db1/tbl1/_stream_load

    前の例では、k1 列の値に 100 が乗算されてからインポートされます。次のデータインポート結果が返されます。

    +------+------+
    | k1   | k2   |
    +------+------+
    |  100 |    2 |
    +------+------+

JSON ルート

Doris では、JSON ルートを指定して、指定された JSON データを抽出できます。

説明

配列内のデータを解析するために、Doris は最初に配列を展開し、次にオブジェクト形式のデータの各行を処理します。したがって、次の例では、単一オブジェクト形式の JSON データが使用されます。

  • JSON ルートを指定しない

    JSON ルートを指定しない場合、Doris はデフォルトでテーブルの列名に基づいてオブジェクト内の要素を検索します。例:

    テーブルには、idcity という名前の 2 つの列が含まれています。次のサンプル JSON データを使用できます。

    { "id": 123, "name" : { "id" : "321", "city" : "shanghai" }}

    Doris は、オブジェクト内の要素を照合するために、id and city 名を使用します。その後、123null が取得されます。

  • JSON ルートの指定

    json_root パラメーターを使用して、JSON データのルートノードを指定します。Doris は、JSON ルートを使用して、解析のためにルートノードの要素を抽出します。デフォルトでは、このパラメーターは空です。

    JSON ルートを -H "json_root: $.name" として指定します。次に、次の要素が照合されます。

    { "id" : "321", "city" : "shanghai" }

    要素は、インポートされる新しい JSON データとして扱われます。321shanghai が取得されます。

NULL 値とデフォルト値

  • 次のサンプル JSON データを使用できます。

    [
        {"k1": 1, "k2": "a"},
        {"k1": 2},
        {"k1": 3, "k2": "c"},
    ]

    テーブルスキーマは k1 int null, k2 varchar(32) null default "x" です。

  • インポートステートメント:

    curl -v --location-trusted -u root: -H "format: json" -H "strip_outer_array: true" -T example.json http://127.0.0.1:8030/api/db1/tbl1/_stream_load

    次のインポート結果が予想されます。欠落している列にはデフォルト値が入力されます。

    +------+------+
    | k1   | k2   |
    +------+------+
    |    1 |    a |
    +------+------+
    |    2 |    x |
    +------+------+
    |    3 |    c |
    +------+------+

    ただし、次の実際のインポート結果が返されます。欠落している列には NULL が入力されます。

    +------+------+
    | k1   | k2   |
    +------+------+
    |    1 |    a |
    +------+------+
    |    2 | NULL |
    +------+------+
    |    3 |    c |
    +------+------+

    これは、Doris がインポートステートメントの情報から、欠落している列がテーブルの k2 列であるという情報を取得しないためです。予想されるインポート結果を取得するには、次のインポートステートメントを実行します。

    curl -v --location-trusted -u root: -H "format: json" -H "strip_outer_array: true" -H "jsonpaths: [\"$.k1\", \"$.k2\"]" -H "columns: k1, tmp_k2, k2 = ifnull(tmp_k2, 'x')" -T example.json http://127.0.0.1:8030/api/db1/tbl1/_stream_load