博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在SQL中计算 array & map & json数据
阅读量:6899 次
发布时间:2019-06-27

本文共 2247 字,大约阅读时间需要 7 分钟。

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

场景

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

__source__:  11.164.232.105__tag__:__hostname__:  vm-req-170103232316569850-tianchi111932.tc__topic__:  TestTopic_4array_column:  [1,2,3]double_column:  1.23map_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)

图片描述

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

图片描述

  1. 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)

结果如下:

图片描述

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

图片描述

转载地址:http://ffcdl.baihongyu.com/

你可能感兴趣的文章
需求变化与IoC
查看>>
The copy of Windows is not genuine-微软自己用盗版
查看>>
浮点数精度
查看>>
[置顶] IT屌丝的离职申请
查看>>
IE7 float:left失效的解决方法
查看>>
WordPress 插件机制的简单用法和原理(Hook 钩子)
查看>>
dbchart
查看>>
GCC指令
查看>>
[转] Exchange Server 2013部署
查看>>
I-129表
查看>>
ImageView setImageURI图片不改变\NetWorkImageView 不显示的问题
查看>>
Flash xml 中文乱码
查看>>
BZOJ 2727 双十字(树状数组)
查看>>
8.2 C++ AMP advanced concepts
查看>>
Linux Mint 11正式版发布!
查看>>
C++开发者快速学习Objective-C语言核“.NET研究”心语法
查看>>
(总结)Nginx使用的php-fpm的两种进程管理方式及优化
查看>>
我的KT库之----数据库的操作(DbHelper)
查看>>
js Grid - 列表插件
查看>>
20个优秀的固定位置网站菜单设计案例
查看>>