Doris では JSON データをインポートできます。このトピックでは、JSON データを Doris にインポートする際に使用されるパラメーターと使用上の注意について説明します。
サポートされているインポート方法
JSON データのインポートには、次のインポート方法のみを使用できます。
[ストリームロード] を使用してローカル JSON ファイルをインポートします。
[ルーチンロード] を使用して、Kafka の 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
名を使用します。その後、123
とbeijing
が取得されます。次のサンプル JSON データを使用できます。
{ "id": 123, "name" : "beijing"}
Doris は、オブジェクト内の要素を照合するために、
id and city
名を使用します。その後、123
とnull
が取得されます。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"]
として指定します。次に、照合された要素は123
とnull
です。Doris は、JSON データの null 値と、照合が失敗したときに返される null 値を区別しません。次のサンプル JSON データを使用できます。
{ "id": 123, "name" : null }
次に、次の 2 つの JSON パスを使用して要素を照合すると、同じ結果(
123
とnull
)が返されます。["$.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 はデフォルトでテーブルの列名に基づいてオブジェクト内の要素を検索します。例:
テーブルには、
id
とcity
という名前の 2 つの列が含まれています。次のサンプル JSON データを使用できます。{ "id": 123, "name" : { "id" : "321", "city" : "shanghai" }}
Doris は、オブジェクト内の要素を照合するために、
id and city
名を使用します。その後、123
とnull
が取得されます。JSON ルートの指定
json_root パラメーターを使用して、JSON データのルートノードを指定します。Doris は、JSON ルートを使用して、解析のためにルートノードの要素を抽出します。デフォルトでは、このパラメーターは空です。
JSON ルートを
-H "json_root: $.name"
として指定します。次に、次の要素が照合されます。{ "id" : "321", "city" : "shanghai" }
要素は、インポートされる新しい JSON データとして扱われます。
321
とshanghai
が取得されます。
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