文档章节

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

阿里云云栖社区
 阿里云云栖社区
发布于 06/22 17:41
字数 847
阅读 13
收藏 0

摘要: 场景 通常,我们处理数据,一列数据类型要么是字符串,要么是数字,这些都是primitive类型的数据。

场景

通常,我们处理数据,一列数据类型要么是字符串,要么是数字,这些都是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来引用展开后的列。结果如下图:

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

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

遍历Map

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

  • 按照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

格式化显示histogram,numeric_histogram的结果

1.histogram

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

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

* | select histogram(method)

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

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

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

2. numeric_histogram

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

* | select numeric_histogram(10,Latency)

numeric_histogram的输出如下:

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

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

结果如下:

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

原文链接

本文为云栖社区原创内容,未经允许不得转载。

© 著作权归作者所有

共有 人打赏支持
阿里云云栖社区
粉丝 63
博文 684
码字总数 1509769
作品 0
朝阳
私信 提问
SQL老司机,在SQL中计算 array & map & json数据

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

云雷
06/19
0
0
日志OLAP:在SQL中使用UDF, lambda函数使用案例

场景 日志服务内置了20+类SQL函数。面对用户复杂的业务场景,例如使用json来沉淀业务数据,普通的SQL函数可能就无法满足需求,需要一些用户自定义处理逻辑。为了处理json类的业务数据,我们可...

云雷
06/26
0
0
日志服务支持Json类型数据

JSON数据作为一种通用类型的数据类型,其自解析、灵活的特性,使其能够很好满足复杂场景下数据的记录需求,在很多日志内容中格式不固定的部分往往都是以json的形式进行记录,如将一次http请求...

suntingtao
02/09
0
0
2、创建DataFrame的方式

1:DataFrame其实它是通过RDD的map方法读取每一条数据,然后把他存到“case class”中。最后通过这个RDD的toDF方法产生的。 由于case class 中有属性字段,而且这些字段的类型都有了,是不是...

刘付kin
2016/11/29
7
0
【Spark 2.0官方文档】Spark SQL、DataFrames以及Datasets指南

文档说明 本文是基于《Spark 官方文档》Spark SQL, DataFrames 以及 Datasets 编程指南 这篇文章翻译而来。 原文中关于R语言的部分本文档全都省略。 由于个人水平有限,有些地方难免翻译的不...

JackieYeah
2016/09/11
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

mysql load data 批量导入使用

最近在研究使用mycat,其中有使用批量数据导入,简单记录一下使用方式。 查看系统属性 mysql>show variables like '%secure%'+--------------------------+-----------------------+| Vari...

FansinZhao
11分钟前
0
0
浅谈React的最大亮点——虚拟DOM

在Web开发中,需要将数据的变化实时反映到UI上,这时就需要对DOM进行操作,但是复杂或频繁的DOM操作通常是性能瓶颈产生的原因,为此,React引入了虚拟DOM(Virtual DOM)的机制。 一、什么是...

peakedness丶
14分钟前
0
0
下一代大数据处理引擎,阿里云实时计算独享模式重磅发布

摘要: 11月14日,阿里云重磅发布了实时计算独享模式,即用户独享一部分物理资源,这部分资源在网络/磁盘/CPU/内存等资源上跟其他用户完全独立,是实时计算在原有共享模式基础上的重大升级。...

阿里云官方博客
19分钟前
0
0
Spring MVC 测试样例

1、需要javax.servlet-api V3.0以上支持 <!--3.0以上版本--> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-......

jcc_codingBoy
21分钟前
2
0
kettle增量同步oracle数据到mysql

kettle增量同步oracle数据到mysql 适合表中有更新时间的字段 kettle安装 绿色,下载后解压即可(略), -> Download 连接数据库 需要导入jdbc相关驱动jar包到lib目录(oracle、mysql对应jar...

o00o
25分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部