doris:JSON导入数据
本文介绍如何在 Doris 中导入 JSON 格式的数据文件。Doris 支持导入标准 JSON 格式数据,通过配置相关参数,可以灵活地处理不同的 JSON 数据结构,并支持从 JSON 数据中抽取字段、处理嵌套结构等场景。
导入方式
以下导入方式支持 JSON 格式的数据导入:
- Stream Load
- Broker Load
- Routine Load
- INSERT INTO FROM S3 TVF
- INSERT INTO FROM HDFS TVF
支持的 JSON 格式
Doris 支持以下三种 JSON 格式:
以 Array 表示的多行数据
适用于批量导入多行数据,要求:
- 根节点必须是数组
- 数组中每个元素是一个对象,表示一行数据
- 必须设置
strip_outer_array=true
示例数据:
[{"id": 123, "city": "beijing"},{"id": 456, "city": "shanghai"}
]// 支持嵌套结构
[{"id": 123, "city": {"name": "beijing", "region": "haidian"}},{"id": 456, "city": {"name": "beijing", "region": "chaoyang"}}
]
以 Object 表示的单行数据
适用于单行数据导入,要求:
- 根节点必须是对象
- 整个对象表示一行数据
示例数据:
{"id": 123, "city": "beijing"}// 支持嵌套结构
{"id": 123, "city": {"name": "beijing", "region": "haidian"}}
注意
通常用于 Routine Load 导入方式,如 Kafka 中的单条消息。
以固定分隔符分隔的多行 Object 数据
适用于批量导入多行数据,要求:
- 每行是一个完整的 JSON 对象
- 必须设置
read_json_by_line=true - 可通过
line_delimiter参数指定行分隔符,默认为\n
示例数据:
{"id": 123, "city": "beijing"}
{"id": 456, "city": "shanghai"}
参数配置
参数支持情况
下表列出了各种导入方式支持的 JSON 格式参数:
| 参数 | 默认值 | Stream Load | Broker Load | Routine Load | TVF |
|---|---|---|---|---|---|
| json paths | 无 | jsonpaths | properties.jsonpaths | properties.jsonpaths | jsonpaths |
| json root | 无 | json_root | properties.json_root | properties.json_root | json_root |
| strip outer array | false | strip_outer_array | properties.strip_outer_array | properties.strip_outer_array | strip_outer_array |
| read json by line | false | read_json_by_line | 不支持配置,都为true | 不支持 | read_json_by_line, 默认为true |
| fuzzy parse | false | fuzzy_parse | properties.fuzzy_parse | 不支持 | fuzzy_parse |
| num as string | false | num_as_string | properties.num_as_string | properties.num_as_string | num_as_string |
注意
- Stream Load:参数直接通过 HTTP Header 指定,如:
-H "jsonpaths: $.data" - Broker Load:参数通过
PROPERTIES指定,如:PROPERTIES("jsonpaths"="$.data") - Routine Load:参数通过
PROPERTIES指定,如:PROPERTIES("jsonpaths"="$.data") - TVF:参数通过 TVF 语句指定,如:
S3("jsonpaths"="$.data")
参数说明
JSON Path
- 作用:指定如何从 JSON 数据中抽取字段
- 类型:字符串数组
- 默认值:无,默认使用列名匹配
- 使用示例:
-- 基本用法 ["$.id", "$.city"]-- 嵌套结构 ["$.id", "$.info.city", "$.data[0].name"]
JSON Root
- 作用:指定 JSON 数据的解析起点
- 类型:字符串
- 默认值:无,默认从根节点开始解析
- 使用示例:
-- 原始数据 {"data": {"id": 123,"city": "beijing"} }-- 设置 json_root json_root = $.data
Strip Outer Array
- 作用:指定是否去除最外层的数组结构
- 类型:布尔值
- 默认值:false
- 使用示例:
-- 原始数据 [{"id": 1, "city": "beijing"},{"id": 2, "city": "shanghai"} ]-- 设置 strip_outer_array=true
Read JSON By Line
- 作用:指定是否按行读取 JSON 数据
- 类型:布尔值
- 默认值:false
- 使用示例:
-- 原始数据(每行一个完整的 JSON 对象) {"id": 1, "city": "beijing"} {"id": 2, "city": "shanghai"}-- 设置 read_json_by_line=true
Fuzzy Parse
- 作用:加速 JSON 数据的导入效率
- 类型:布尔值
- 默认值:false
- 限制:
- Array 中每行数据的字段顺序必须完全一致
- 通常与 strip_outer_array 配合使用
- 性能:可提升 3-5 倍导入效率
Num As String
- 作用:指定是否将 JSON 中的数值类型以字符串形式解析
- 类型:布尔值
- 默认值:false
- 使用场景:
- 处理超出数值范围的大数
- 避免数值精度损失
- 使用示例:
-- 原始数据 {"id": "12345678901234567890","price": "99999999.999999" } -- 设置 num_as_string=true, price 字段将以字符串形式解析
JSON Path 和 Columns 的关系
在数据导入过程中,JSON Path 和 Columns 各自承担不同的职责:
JSON Path:定义数据抽取规则
- 从 JSON 数据中按指定路径抽取字段
- 抽取的字段按 JSON Path 中定义的顺序进行重排列
Columns:定义数据映射规则
- 将抽取的字段映射到目标表的列
- 可以进行列的重排和转换
这两个参数的处理过程是串行的:首先 JSON Path 从源数据中抽取字段并形成有序的数据集,然后 Columns 将这些数据映射到表的列中。如果不指定 Columns,抽取的字段将按照表的列顺序直接映射。
使用示例
仅使用 JSON Path
表结构和数据:
-- 表结构
CREATE TABLE example_table (k2 int,k1 int
);-- JSON 数据
{"k1": 1, "k2": 2}
导入命令:
curl -v ... -H "format: json" \-H "jsonpaths: [\"$.k2\", \"$.k1\"]" \-T example.json \http://<fe_host>:<fe_http_port>/api/db_name/table_name/_stream_load
导入结果:
+------+------+
| k1 | k2 |
+------+------+
| 2 | 1 |
+------+------+
使用 JSON Path + Columns
使用相同的表结构和数据,添加 columns 参数:
导入命令:
curl -v ... -H "format: json" \-H "jsonpaths: [\"$.k2\", \"$.k1\"]" \-H "columns: k2, k1" \-T example.json \http://<fe_host>:<fe_http_port>/api/db_name/table_name/_stream_load
导入结果:
+------+------+
| k1 | k2 |
+------+------+
| 1 | 2 |
+------+------+
字段重复使用
表结构和数据:
-- 表结构
CREATE TABLE example_table (k2 int,k1 int,k1_copy int
);-- JSON 数据
{"k1": 1, "k2": 2}
导入命令:
curl -v ... -H "format: json" \-H "jsonpaths: [\"$.k2\", \"$.k1\", \"$.k1\"]" \-H "columns: k2, k1, k1_copy" \-T example.json \http://<fe_host>:<fe_http_port>/api/db_name/table_name/_stream_load
导入结果:
+------+------+---------+
| k2 | k1 | k1_copy |
+------+------+---------+
| 2 | 1 | 1 |
+------+------+---------+
嵌套字段映射
表结构和数据:
-- 表结构
CREATE TABLE example_table (k2 int,k1 int,k1_nested1 int,k1_nested2 int
);-- JSON 数据
{"k1": 1,"k2": 2,"k3": {"k1": 31,"k1_nested": {"k1": 32}}
}
导入命令:
curl -v ... -H "format: json" \-H "jsonpaths: [\"$.k2\", \"$.k1\", \"$.k3.k1\", \"$.k3.k1_nested.k1\"]" \-H "columns: k2, k1, k1_nested1, k1_nested2" \-T example.json \http://<fe_host>:<fe_http_port>/api/db_name/table_name/_stream_load
导入结果:
+------+------+------------+------------+
| k2 | k1 | k1_nested1 | k1_nested2 |
+------+------+------------+------------+
| 2 | 1 | 31 | 32 |
+------+------+------------+------------+
使用示例
本节展示了不同导入方式下的 JSON 格式使用方法。
Stream Load 导入
# 使用 JSON Path
curl --location-trusted -u <user>:<passwd> \-H "format: json" \-H "jsonpaths: [\"$.id\", \"$.city\"]" \-T example.json \http://<fe_host>:<fe_http_port>/api/example_db/example_table/_stream_load# 指定 JSON root
curl --location-trusted -u <user>:<passwd> \-H "format: json" \-H "json_root: $.events" \-T example.json \http://<fe_host>:<fe_http_port>/api/example_db/example_table/_stream_load# 按行读取 JSON
curl --location-trusted -u <user>:<passwd> \-H "format: json" \-H "read_json_by_line: true" \-T example.json \http://<fe_host>:<fe_http_port>/api/example_db/example_table/_stream_load
Broker Load 导入
-- 使用 JSON Path
LOAD LABEL example_db.example_label
(DATA INFILE("s3://bucket/path/example.json")INTO TABLE example_tableFORMAT AS "json"PROPERTIES("jsonpaths" = "[\"$.id\", \"$.city\"]")
)
WITH S3
(...
);-- 指定 JSON root
LOAD LABEL example_db.example_label
(DATA INFILE("s3://bucket/path/example.json")INTO TABLE example_tableFORMAT AS "json"PROPERTIES("json_root" = "$.events")
)
WITH S3
(...
);
Routine Load 导入
-- 使用 JSON Path
CREATE ROUTINE LOAD example_db.example_job ON example_table
PROPERTIES
("format" = "json","jsonpaths" = "[\"$.id\", \"$.city\"]"
)
FROM KAFKA
(...
);
TVF 导入
-- 使用 JSON Path
INSERT INTO example_table
SELECT *
FROM S3
("uri" = "s3://bucket/example.json","format" = "json","jsonpaths" = "[\"$.id\", \"$.city\"]",...
);-- 指定 JSON root
INSERT INTO example_table
SELECT *
FROM S3
("uri" = "s3://bucket/example.json","format" = "json","json_root" = "$.events",...
);
相关文章:
doris:JSON导入数据
本文介绍如何在 Doris 中导入 JSON 格式的数据文件。Doris 支持导入标准 JSON 格式数据,通过配置相关参数,可以灵活地处理不同的 JSON 数据结构,并支持从 JSON 数据中抽取字段、处理嵌套结构等场景。 导入方式 以下导入方式支持 JSON 格式…...
Ubuntu18.04 搭建DHCP服务器
在Ubuntu系统中,DHCP(动态主机配置协议)服务通常由isc-dhcp-server软件包提供。要配置和使用DHCP服务,你可以按照以下步骤操作: 1. 安装DHCP服务器 首先,你需要安装isc-dhcp-server。打开终端并输入以下命…...
Spring Boot 邂逅Netty:构建高性能网络应用的奇妙之旅
一、引言 在当今数字化时代,构建高效、可靠的网络应用是开发者面临的重要挑战。Spring Boot 作为一款强大的 Java 开发框架,以其快速开发、简洁配置和丰富的生态支持,深受广大开发者喜爱。而 Netty 作为高性能、异步的网络通信框架ÿ…...
【云安全】云原生-Docker(五)容器逃逸之漏洞利用
漏洞利用逃逸 通过漏洞利用实现逃逸,主要分为以下两种方式: 1、操作系统层面的内核漏洞 这是利用宿主机操作系统内核中的安全漏洞,直接突破容器的隔离机制,获得宿主机的权限。 攻击原理:容器本质上是通过 Linux 的…...
九、CSS工程化方案
一、PostCSS介绍 二、PostCSS插件的使用 项目安装 - npm install postcss-cli 全局安装 - npm install postcss-cli -g postcss-cli地址:GitHub - postcss/postcss-cli: CLI for postcss postcss地址:GitHub - postcss/postcss: Transforming styles…...
gradle创建springboot单项目和多模块项目
文章目录 gradle创建springboot项目gradle多模块项目创建 gradle创建springboot项目 适用IDEA很简单,如下图 gradle多模块项目创建 首选创建父项目,然后删除无用内容至下图 选择父项目目录,右键选择模块,创建子项目(…...
Vue实现div滚动,并且支持top动态滚动
如果你知道距离目标 div 顶部的像素值,并希望通过传入 top 参数来实现滚动到对应区域,可以使用 window.scrollTo 方法。 编写滚动方法 const scrollToDiv (targetDiv, top) > {if (targetDiv) {top top * targetDiv.value.scrollHeight / data.he…...
Elasticsearch 中,分片(Shards)数量上限?副本的数量?
概念 ElasticSearch高可用集群架构实战 分片数量1 在 Elasticsearch 中,分片(Shards)是数据存储和索引的基本单位。创建分片时需要考虑多个因素,包括集群的配置、硬件资源(如磁盘空间、内存等)以及性能要…...
Unity入门1
安装之后无法获得许可证,可以考虑重装 新建项目 单击空白处生成脚本 双击c#文件 会自动打开vstudio 检查引用 如果没有引用,重开vstu,或者重新加载项目 hierarchy层级 scenes场景 assets资产 inspector督察 icon图标 资源链接&…...
网络模型简介:OSI七层模型与TCP/IP模型
计算机网络是现代信息社会的基石,而网络通信的基础在于理解网络模型。网络模型是对通信过程的抽象,它帮助我们理解数据从源到目的地的传输过程。常见的网络模型有 OSI 七层模型 和 TCP/IP 模型,这两种模型在理论和实践中都起着重要作用。 一、…...
软件测试压力太大了怎么办?
本文其实是知乎上针对一个问题的回答: 目前在做软件测试,主要负责的是手机端的项目测试,项目迭代很快,每次上线前验正式都会发现一些之前验测试包时候没有发现的问题,压力太大了,应该怎么调整 看过我之前其…...
微信小程序-点餐(美食屋)02开发实践
目录 概要 整体架构流程 (一)用户注册与登录 (二)菜品浏览与点餐 (三)订单管理 (四)后台管理 部分代码展示 1.index.wxml 2.list.wxml 3.checkout.wxml 4.detail.wxml 小结优点 概要…...
转换算术表达式
文章目录 构造二叉树表示的算术表达式:按先序次序输入二叉树中结点的值(操作数及运算符均以一位字符表示,注意转换), #字符表示空树,如上图的算术表达式 输入2##*3##4## 输入格式 第一行输入表示要计算的算术表达式的二叉树结点的…...
99.17 金融难点通俗解释:归母净利润
目录 0. 承前1. 简述2. 比喻:小明家的小卖部2.1 第一步:计算收到的所有钱2.2 第二步:减去各种支出2.3 第三步:计算能带回家的钱 3. 生活中的例子3.1 好的经营情况3.2 一般的经营情况3.3 不好的经营情况 4. 小朋友要注意4.1 为什么…...
【Flutter】旋转元素(Transform、RotatedBox )
这里写自定义目录标题 Transform旋转元素可以改变宽高约束的旋转 - RotatedBox Transform旋转元素 说明:Transform旋转操作改变了元素的方向,但并没有改变它的布局约束。因此,虽然视觉上元素看起来是旋转了,但它仍然遵循原始的宽…...
MYSQL学习笔记(六):聚合函数、sql语句执行原理简要分析
前言: 学习和使用数据库可以说是程序员必须具备能力,这里将更新关于MYSQL的使用讲解,大概应该会更新30篇,涵盖入门、进阶、高级(一些原理分析);这一篇是内容较少,主要讲解:聚合函数和简要介绍sql语句执行过…...
thinkphp6+swoole使用rabbitMq队列
安装think-swoole安装 composer require php-amqplib/php-amqplib,以支持rabbitMq使用安装rabbitMq延迟队列插件 安装 rabbitmq_delayed_message_exchange 插件,按照以下步骤操作: 下载插件:https://github.com/rabbitmq/rabbitmq-delayed-…...
大模型开发 | RAG在实际开发中可能遇到的坑
近年来,大语言模型 (LLM) 的飞速发展令人瞩目,它们在各个领域展现出强大的应用潜力。然而,LLM 也存在一些固有的局限性,例如知识更新滞后、信息编造 (幻觉) 等问题。为了克服这些挑战,检索增强生成 (Retrieval-Augment…...
mybatis是什么?有什么作用?mybatis的简单使用
mybatis是什么? MyBatis 是一个持久层框架。 有什么作用? 简化了对数据库数据的操作。 如何简化数据操作的? MyBatis 通过提供 SQL 映射、动态 SQL、结果映射、事务管理等功能,我们直接去用就可以了。 怎么使用?&…...
求平均年龄(信息学奥赛一本通-1059)
【题目描述】 班上有学生若干名,给出每名学生的年龄(整数),求班上所有学生的平均年龄,保留到小数点后两位。 【输入】 第一行有一个整数n(1≤n≤100),表示学生的人数。其后n行每行有…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...
电脑桌面太单调,用Python写一个桌面小宠物应用。
下面是一个使用Python创建的简单桌面小宠物应用。这个小宠物会在桌面上游荡,可以响应鼠标点击,并且有简单的动画效果。 import tkinter as tk import random import time from PIL import Image, ImageTk import os import sysclass DesktopPet:def __i…...
Springboot 高校报修与互助平台小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,高校报修与互助平台小程序被用户普遍使用,为…...
Qt/C++学习系列之列表使用记录
Qt/C学习系列之列表使用记录 前言列表的初始化界面初始化设置名称获取简单设置 单元格存储总结 前言 列表的使用主要基于QTableWidget控件,同步使用QTableWidgetItem进行单元格的设置,最后可以使用QAxObject进行单元格的数据读出将数据进行存储。接下来…...
后端下载限速(redis记录实时并发,bucket4j动态限速)
✅ 使用 Redis 记录 所有用户的实时并发下载数✅ 使用 Bucket4j 实现 全局下载速率限制(动态)✅ 支持 动态调整限速策略✅ 下载接口安全、稳定、可监控 🧩 整体架构概览 模块功能Redis存储全局并发数和带宽令牌桶状态Bucket4j Redis分布式限…...
