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行每行有…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

LabVIEW双光子成像系统技术
双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...