数仓高频操作JSON篇

简介: 数仓高频操作JSON篇

前言

JSON的话在实际开发中大量使用了,常规的解析操作直接一把百度就可以查到了,不过总有一些犄角旮旯的需求让人抓狂,今天对JSON部分操作进行一些梳理,方便碰到之后在这里可以查询。

GET_JSON_OBJECT

命令格式

string get_json_object(string <json>, string <path>)

需要注意的是第二个参数其实是path,实际是如下的使用,蛮多人对那个$.a云里雾里,这里头到底写啥呢,我比较喜欢找到原始的出处,其实是在Hive上面有对这个进行说明,链接,对应描述如下:

get_json_object
A limited version of JSONPath is supported:
$ : Root object 美元符号,代表根对象
. : Child operator 点号,代表子节点的操作
[] : Subscript operator for array  中括号,数组的下标操作符,[0],[1]..这种
* : Wildcard for []其实是表示数组操作的通配符[*],这样子就是全部的元素了

总体来说其实里面的规则不多,就是支持$.[]*这几种操作,当然这些操作已经可以满足我们大部分需求了,我们测试一下官网给出的例子:

{
  "store": {
    "fruit": [{
      "weight": 8,
      "type": "apple"
    }, {
      "weight": 9,
      "type": "pear"
    }],
    "bicycle": {
      "price": 19.95,
      "color": "red"
    }
  },
  "email": "amy@only_for_json_udf_test.net",
  "owner": "amy"
}
SELECT get_json_object(json, '$.owner') FROM src_json;
结果:
amy
 
SELECT get_json_object(json, '$.store.fruit[0]') FROM src_json;
结果:
{"weight":8,"type":"apple"}
 
SELECT get_json_object(json, '$.non_exist_key') FROM src_json;
结果:
NULL

数组操作

select GET_JSON_OBJECT(json, '$.store.fruit[*]') AS fruits from src_json

结果:
[{
      "weight": 8,
      "type": "apple"
    }, {
      "weight": 9,
      "type": "pear"
    }]

FROM_JSON

命令格式

from_json(<jsonStr>, <schema>)

根据JSON字符串jsonStr和schema信息,返回ARRAY、MAP或STRUCT类型。当我们需要进行一些复杂的操作的时候,需要对把JSON加工成对象形式,可以进一步提取信息。

举例说明:在上面一步操作上,我们已经fruit信息进行提前,但是有个情况,我们其实看到结果就是一行数据,我们希望每一个水果的内容都是一行信息,完整sql如下:

select fruit['type'] as type,fruit['weight'] as weight from (
select explode(from_json(GET_JSON_OBJECT(json, '$.store.fruit[*]'),'array<map<string, string>>')) AS fruit from values ('
{
  \"store\": {
    \"fruit\": [{
      \"weight\": 8,
      \"type\": \"apple\"
    }, {
      \"weight\": 9,
      \"type\": \"pear\"
    }],
    \"bicycle\": {
      \"price\": 19.95,
      \"color\": \"red\"
    }
  },
  \"email\": \"amy@only_for_json_udf_test.net\",
  \"owner\": \"amy\"
}') src_json(json)  
)

结果如下:

type weight
apple 8
pear 9

from_json函数实现了把原有的json数组进行映射array<map<string, string>>,得到的数组通过explode展开

map_keys 获取key

这个udf不复杂,就是提取key,只不过一时半会想不到,提取key的场景少很多,但是需要的时候就头大。

select map_keys(from_json(json,'map<string,string>'))
from values('{"a":1,"b":2}') src_json(json)

结果:[a, b]

可以看到,如果需要变成一行行数据的话也需要通过explode展开:


select explode(map_keys(from_json(json,'map<string,string>'))) as key
from values('{"a":1,"b":2}') src_json(json)
key
a
b

集合操作

有了前面的基础,可以通过json提取之后配合一些集合的操作,例如,前面的fruit我需要提取type='apple’怎么去做,方法一:通过最后来一个where条件,也可以,方法二就是通过filter集合操作来运算:

select fruit['type'] as type,fruit['weight'] as weight from (
select explode(filter(from_json(GET_JSON_OBJECT(json, '$.store.fruit[*]'),'array<map<string, string>>'),x->x['type']='apple')) AS fruit from values ('
{
  \"store\": {
    \"fruit\": [{
      \"weight\": 8,
      \"type\": \"apple\"
    }, {
      \"weight\": 9,
      \"type\": \"pear\"
    }],
    \"bicycle\": {
      \"price\": 19.95,
      \"color\": \"red\"
    }
  },
  \"email\": \"amy@only_for_json_udf_test.net\",
  \"owner\": \"amy\"
}') src_json(json)  
)

结果如下:

type weight
apple 8
相关实践学习
数据库实验室挑战任务-初级任务
本场景介绍如何开通属于你的免费云数据库,在RDS-MySQL中完成对学生成绩的详情查询,执行指定类型SQL。
阿里云云原生数据仓库AnalyticDB MySQL版 使用教程
云原生数据仓库AnalyticDB MySQL版是一种支持高并发低延时查询的新一代云原生数据仓库,高度兼容MySQL协议以及SQL:92、SQL:99、SQL:2003标准,可以对海量数据进行即时的多维分析透视和业务探索,快速构建企业云上数据仓库。 了解产品 https://www.aliyun.com/product/ApsaraDB/ads
目录
相关文章
|
1月前
|
存储 JSON 安全
【C++ JSON库 json值的创建手段】深入探究C++中JSON对象定位与操作:从引用到回调函数
【C++ JSON库 json值的创建手段】深入探究C++中JSON对象定位与操作:从引用到回调函数
90 0
|
1月前
|
JSON JavaScript API
Node.js(nodejs)对本地JSON文件进行增、删、改、查操作(轻车熟路)
Node.js(nodejs)对本地JSON文件进行增、删、改、查操作(轻车熟路)
|
8月前
|
SQL 存储 分布式计算
数仓 Hive HA 介绍与实战操作
数仓 Hive HA 介绍与实战操作
|
1月前
|
JSON NoSQL MongoDB
实时计算 Flink版产品使用合集之要将收集到的 MongoDB 数据映射成 JSON 对象而非按字段分割,该怎么操作
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
13天前
|
SQL Cloud Native 关系型数据库
云原生数据仓库AnalyticDB操作报错合集之执行sql的进程报错:"unknown connection id",是什么导致的
阿里云AnalyticDB提供了全面的数据导入、查询分析、数据管理、运维监控等功能,并通过扩展功能支持与AI平台集成、跨地域复制与联邦查询等高级应用场景,为企业构建实时、高效、可扩展的数据仓库解决方案。以下是对AnalyticDB产品使用合集的概述,包括数据导入、查询分析、数据管理、运维监控、扩展功能等方面。
739 3
|
13天前
|
SQL Cloud Native 关系型数据库
云原生数据仓库AnalyticDB操作报错合集之报错代码"[31004, 2023121817001319216817200303151051107] : Compiler failed and interpreter is disabled"是什么导致的
阿里云AnalyticDB提供了全面的数据导入、查询分析、数据管理、运维监控等功能,并通过扩展功能支持与AI平台集成、跨地域复制与联邦查询等高级应用场景,为企业构建实时、高效、可扩展的数据仓库解决方案。以下是对AnalyticDB产品使用合集的概述,包括数据导入、查询分析、数据管理、运维监控、扩展功能等方面。
673 3
|
6天前
|
JSON 资源调度 Kubernetes
实时计算 Flink版操作报错合集之解析JSON数组时,遇到报错,该怎么解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
1月前
|
SQL DataWorks 关系型数据库
DataWorks操作报错合集之DataWorks在同步mysql时报错Code:[Framework-02],mysql里面有个json类型字段,是什么原因导致的
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
59 0
|
1月前
|
JSON 分布式计算 大数据
MaxCompute产品使用合集之大数据计算MaxCompute 要提取JSON字符串中的所有key-value对,我该怎么操作
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
1月前
|
JSON Java 数据处理
Spring Boot与Jsonson对象:灵活的JSON操作实战
【4月更文挑战第28天】在现代Web应用开发中,JSON数据格式的处理至关重要。假设 "Jsonson" 代表一个类似于Jackson的库,这样的工具在Spring Boot中用于处理JSON。本篇博客将介绍Spring Boot中处理JSON数据的基本概念,并通过实际例子展示如何使用类似Jackson的工具进行数据处理。
41 0

热门文章

最新文章