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行每行有…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
