SQL老司机,在SQL中计算 array & map & json数据

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
日志服务 SLS,月写入数据量 50GB 1个月
简介: 场景 通常,我们处理数据,一列数据类型要么是字符串,要么是数字,这些都是primitive类型的数据。在某些比较复杂的业务场景下,我们会在一列中使用复杂的格式,例如数组array, 对象(map),json等格式来表示复杂的数据,例如: __source__: 11.

场景

通常,我们处理数据,一列数据类型要么是字符串,要么是数字,这些都是primitive类型的数据。在某些比较复杂的业务场景下,我们会在一列中使用复杂的格式,例如数组array, 对象(map),json等格式来表示复杂的数据,例如:

__source__:  11.164.232.105
__tag__:__hostname__:  vm-req-170103232316569850-tianchi111932.tc
__topic__:  TestTopic_4
array_column:  [1,2,3]
double_column:  1.23
map_column:  {"a":1,"b":2}
text_column:  商品

array_column 是数组类型。假如,我们希望统计array_column中所有数值的汇总值,那么我们得遍历每一行的数组中的每一个元素。

unnest语法

  • unnest( array) as table_alias(column_name)
    表示把array类型展开成多行,行的名称为column_name。
  • unnest(map) as table(key_name, value_name)

    表示把map类型展开成多行,key的名称为key_name, value的名称为value_name
    

注意,由于unnest接收的是array或者map类型的数据,如果用户的输入是个字符串类型,那么要先转化成json类型,然后再转化成array类型或map类型,转化的方式是cast(json_parse(array_column) as array(bigint))

遍历数组每一个元素

使用SQL把array展开成多行:

* | select  array_column, a   from log, unnest( cast( json_parse(array_column)   as array(bigint) ) ) as  t(a)

上述SQL把数组展开成多行数字,unnest( cast( json_parse(array_column) as array(bigint) ) ) as t(a),unnest语法把数组展开,以t来命名新生成的表,使用a来引用展开后的列。结果如下图:

image.png

  • 统计数组中的每个元素的和
* | select   sum(a)    from log, unnest( cast( json_parse(array_column)   as array(bigint) ) ) as  t(a)

image.png

  • 按照数组中的每个元素进行group by计算
* | select   a, count(1)    from log, unnest( cast( json_parse(array_column)   as array(bigint) ) ) as  t(a)     group by a

image.png

遍历Map

  • 遍历Map中的元素
* | select  map_column , a,b    from log, unnest( cast( json_parse(map_column)   as map(varchar, bigint) ) ) as  t(a,b)

image.png

  • 按照Map的key进行group by 统计
* | select   key,  sum(value)    from log, unnest( cast( json_parse(map_column)   as map(varchar, bigint) ) ) as  t(key,value)    GROUP  BY  key

image.png

格式化显示histogram,numeric_histogram的结果

1.histogram

histogram函数类似于count group by 语法。语法参考文档

通常我们看到histogram的结果如下:

* | select histogram(method)

image.png

是一串json,无法配置视图展示,我们可以用unnest语法,把json展开成多行配置视图,例如:

* | select  key , value  from( select histogram(method) as his from log) , unnest(his ) as t(key,value)

image.png

接下来,可以配置可视化视图:

image.png

2. numeric_histogram

numeric_histogram语法是为了把数值列分配到多个桶中去,相当于对数值列进行group by,具体语法参考文档

* | select numeric_histogram(10,Latency)

numeric_histogram的输出如下:

image.png

为了格式化展示该结果,我们这样写SQL:

* |  select key,value from(select numeric_histogram(10,Latency) as his from log) , unnest(his) as t(key,value)

结果如下:

image.png

同时配置柱状图的形式展示:

image.png

目录
相关文章
|
2月前
|
SQL 存储 缓存
SQL Server 数据太多如何优化
11种优化方案供你参考,优化 SQL Server 数据库性能得从多个方面着手,包括硬件配置、数据库结构、查询优化、索引管理、分区分表、并行处理等。通过合理的索引、查询优化、数据分区等技术,可以在数据量增大时保持较好的性能。同时,定期进行数据库维护和清理,保证数据库高效运行。
|
3月前
|
SQL 移动开发 Oracle
SQL语句实现查询连续六天数据的方法与技巧
在数据库查询中,有时需要筛选出符合特定时间连续性条件的数据记录
|
3月前
|
SQL 存储 关系型数据库
添加数据到数据库的SQL语句详解与实践技巧
在数据库管理中,添加数据是一个基本操作,它涉及到向表中插入新的记录
|
3月前
|
SQL 数据挖掘 数据库
SQL查询每秒的数据:技巧、方法与性能优化
id="">SQL查询功能详解 SQL(Structured Query Language,结构化查询语言)是一种专门用于与数据库进行沟通和操作的语言
|
3月前
|
SQL 存储 缓存
SQL计算班级语文平均分:详细步骤与技巧
在数据库管理和分析中,经常需要计算某个班级在特定科目上的平均分
|
3月前
|
SQL 监控 数据处理
SQL数据库数据修改操作详解
数据库是现代信息系统的重要组成部分,其中SQL(StructuredQueryLanguage)是管理和处理数据库的重要工具之一。在日常的业务运营过程中,数据的准确性和及时性对企业来说至关重要,这就需要掌握如何在数据库中正确地进行数据修改操作。本文将详细介绍在SQL数据库中如何修改数据,帮助读者更好
636 4
|
3月前
|
SQL 分布式计算 Java
大数据-96 Spark 集群 SparkSQL Scala编写SQL操作SparkSQL的数据源:JSON、CSV、JDBC、Hive
大数据-96 Spark 集群 SparkSQL Scala编写SQL操作SparkSQL的数据源:JSON、CSV、JDBC、Hive
81 0
|
4月前
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
6月前
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
148 13
|
6月前
|
SQL
解锁 SQL Server 2022的时间序列数据功能
【7月更文挑战第14天】要解锁SQL Server 2022的时间序列数据功能,可使用`generate_series`函数生成整数序列,例如:`SELECT value FROM generate_series(1, 10)。此外,`date_bucket`函数能按指定间隔(如周)对日期时间值分组,这些工具结合窗口函数和其他时间日期函数,能高效处理和分析时间序列数据。更多信息请参考官方文档和技术资料。