[{ "id": 123, "city" : "beijing"},{ "id": 456, "city" : "shanghai"},...]
[{ "id": 123, "city" : { "name" : "beijing", "region" : "haidian"}},{ "id": 456, "city" : { "name" : "beijing", "region" : "chaoyang"}},...]
strip_outer_array=true 使用。Doris 在解析时会将数组展开,然后依次解析其中的每一个 Object 作为一行数据。{ "id": 123, "city" : "beijing"}
{ "id": 123, "city" : { "name" : "beijing", "region" : "haidian" }}
{ "id": 123, "city" : "beijing"}{ "id": 456, "city" : "shanghai"}...
read_json_by_line=true 使用,特殊分隔符还需要指定line_delimiter参数,默认\\n。Doris 在解析时会按照分隔符分隔,然后解析其中的每一行 Object 作为一行数据。fuzzy_parse 参数来加速 JSON 数据的导入效率。
这个参数通常用于导入 以 Array 表示的多行数据 这种格式,所以一般要配合 strip_outer_array=true 使用。
这个功能要求 Array 中的每行数据的字段顺序完全一致。Doris 仅会根据第一行的字段顺序做解析,然后以下标的形式访问之后的数据。该方式可以提升 3-5X 的导入效率。id, city。
Json 数据如下:{ "id": 123, "city" : "beijing"}
id, city 进行匹配,得到最终数据 123 和 beijing。
如果 Json 数据如下:{ "id": 123, "name" : "beijing"}
id, city 进行匹配,得到最终数据 123 和 null。["$.id", "$.name"]
["$.id.sub_id", "$.name[0]", "$.city[0]"]
{ "id": 123, "city" : { "name" : "beijing", "region" : "haidian" }}
["$.city"] 。则匹配到的元素为:{ "name" : "beijing", "region" : "haidian" }
"{'name':'beijing','region':'haidian'}"
null。示例如下:
Json 数据为:{ "id": 123, "name" : "beijing"}
["$.id", "$.info"] 。则匹配到的元素为 123 和 null。
Doris 当前不区分 Json 数据中表示的 null 值,和匹配失败时产生的 null 值。假设 Json 数据为:{ "id": 123, "name" : null }
123 和 null。["$.id", "$.name"]
["$.id", "$.info"]
{ "id": 123, "city" : "beijing" }
id 和 city):["$.ad", "$.infa"]
null, null。{"k1" : 1, "k2": 2}
k2 int, k1 int
导入语句1(以 Stream Load 为例):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
+------+------+| k1 | k2 |+------+------+| 2 | 1 |+------+------+
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
k2, k1 的顺序。即按Json Path 中字段的顺序抽取后,指定第一列为表中 k2 列的值,而第二列为表中 k1 列的值。最终导入的数据结果如下:+------+------+| k1 | k2 |+------+------+| 1 | 2 |+------+------+
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 | k2 |+------+------+| 100 | 2 |+------+------+
[{"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 |+------+------+
+------+------+| k1 | k2 |+------+------+| 1 | a |+------+------+| 2 | NULL |+------+------+| 3 | c |+------+------+
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
[{"k1": 1, "k2":9999999999999.999999 }]
Decimal(16, 9) ,数据为:9999999999999.999999。在进行 Json 导入时,由于 Double 转换的精度丢失导致了导入的数据为:10000000000000.0002,引发了导入出错。
为了解决这个问题,Doris 在导入时提供了 num_as_string的开关。Doris 在解析 Json 数据时会将数字类型转为字符串,然后在确保不会出现精度丢失的情况下进行导入。curl -v --location-trusted -u root: -H "format: json" -H "num_as_string: true" -T example.json http://127.0.0.1:8030/api/db1/tbl1/_stream_load
num_as_string会同样将复合类型的数字转换为字符串,举个例子:
Json 数据为:{ "id": 123, "city" : { "name" : "beijing", "city_id" : 1 }}
不开启num_as_string时,导入的city列的数据为:{ "name" : "beijing", "city_id" : 1 }
而开启了num_as_string时,导入的city列的数据为:{ "name" : "beijing", "city_id" : "1" }num_as_string后对复合类型导入的副作用。id INT NOT NULL,city VARHCAR NULL,code INT NULL
{"id": 100, "city": "beijing", "code" : 1}
curl --location-trusted -u user:passwd -H "format: json" -T data.json http://localhost:8030/api/db1/tbl1/_stream_load
100 beijing 1
curl --location-trusted -u user:passwd -H "format: json" -H "jsonpaths: [\\"$.id\\",\\"$.city\\",\\"$.code\\"]" -T data.json http://localhost:8030/api/db1/tbl1/_stream_load
100 beijing 1
{"id": 100, "content": {"city": "beijing", "code" : 1}}
curl --location-trusted -u user:passwd -H "format: json" -H "jsonpaths: [\\"$.id\\",\\"$.content.city\\",\\"$.content.code\\"]" -T data.json http://localhost:8030/api/db1/tbl1/_stream_load
100 beijing 1
[{"id": 100, "city": "beijing", "code" : 1},{"id": 101, "city": "shanghai"},{"id": 102, "city": "tianjin", "code" : 3},{"id": 103, "city": "chongqing", "code" : 4},{"id": 104, "city": ["zhejiang", "guangzhou"], "code" : 5},{"id": 105,"city": {"order1": ["guangzhou"]},"code" : 6}]
curl --location-trusted -u user:passwd -H "format: json" -H "jsonpaths: [\\"$.id\\",\\"$.city\\",\\"$.code\\"]" -H "strip_outer_array: true" -T data.json http://localhost:8030/api/db1/tbl1/_stream_load
100 beijing 1101 shanghai NULL102 tianjin 3103 chongqing 4104 ["zhejiang","guangzhou"] 5105 {"order1":["guangzhou"]} 6
code 列加1后导入。curl --location-trusted -u user:passwd -H "format: json" -H "jsonpaths: [\\"$.id\\",\\"$.city\\",\\"$.code\\"]" -H "strip_outer_array: true" -H "columns: id, city, tmpc, code=tmpc+1" -T data.json http://localhost:8030/api/db1/tbl1/_stream_load
100 beijing 2101 shanghai NULL102 tianjin 4103 chongqing 5104 ["zhejiang","guangzhou"] 6105 {"order1":["guangzhou"]} 7
文档反馈