`
猫耳呀
  • 浏览: 167641 次
社区版块
存档分类
最新评论

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

阅读更多

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

场景

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

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)

结果如下:

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

原文链接

分享到:
评论

相关推荐

    从格式不确定的json中读取键值对

    在处理JSON数据时,我们经常会遇到格式不一致的情况,这主要源于JSON的灵活性,它可以包含对象、数组、字符串、数字、布尔值以及null等多种数据类型。对于格式不确定的JSON字符串,Java提供了多种库来帮助我们解析,...

    vue与后台对街格式

    JSON.stringify(this.arrayFiltering()) 后台 JSONArray array = new JSONArray(tagsItems); for (int i = 0; i < array.length(); i++) { JSONObject obj = array.getJSONObject(i); Map map = JSONUtil....

    hive中定义的复杂数据类型导入到es中问题总结.doc

    本文主要讨论了如何将 Hive 中定义的复杂数据类型(如 array<struct<...>>)导入到 ES 中,并解决在此过程中遇到的各种问题。 #### 三、Hive 中的复杂数据类型 Hive 支持多种复杂数据类型,如 array、map 和 struct...

    Hive+经纬度+数据导入ES

    在将Hive中的数据导入到Elasticsearch时,如果Hive表中存在一个表示地理坐标的字段(如`location`),且该字段的类型为`array<double>`,那么直接导入到Elasticsearch后可能会导致该坐标数据无法正常被识别和使用。...

    hive-json-serde

    Map解析json中的对象:{“ pluginList”:[{“ name”:“ 1”,“ browser”:“ 1”,“ on”:“ 2”},{“ name“:” 1“,” browser“:” 3“,” on“:” 2“}]}创建表sql:创建表test_json(pluginlist ...

    开源项目-thedevsaddam-gojsonq.zip

    这是gojsonq的主要工作对象,它接受一个JSON字符串或[]byte作为输入,并提供了一系列方法,如`Get()`, `Array()`, `Map()`, `Value()`, `String()`, `Int()`, `Float()`, `Bool()`等,用于从JSON数据中获取不同类型...

    SparkSQL入门级教程

    - **复杂数据结构转换**:DataFrame 支持处理嵌套数据类型,如 Array 和 Map,可以将这些复杂结构转换为 DataFrame。 **SQL 语句查询 DataFrame** SparkSQL 允许通过 SQL 语句直接查询 DataFrame。在 Spark 3.0 ...

    Json 自定义使用函数的简单实例

    在本文中,我们将深入探讨如何在Java中自定义使用JSON(JavaScript Object Notation)功能,特别是在处理对象转换为JSON字符串的场景。这个简单的实例展示了如何创建一个名为`JsonUtils`的工具类,它包含了将Java...

    hive数据类型共6页.pdf.zip

    在Hive中,数据类型是构建数据模型的基础,它们决定了数据如何被存储和处理。Hive作为大数据处理的工具,提供了丰富的数据类型来满足不同场景的需求。本资料“hive数据类型共6页.pdf”可能详细介绍了Hive中的各种...

    03_SparkSql.docx

    - 支持嵌套数据类型(struct、array、map)。 - 提供了结构化的数据查询API,使得操作更为方便。 - 性能上优于RDD,原因在于: - 查询计划会经过Spark Catalyst Optimizer的优化,从而减少不必要的计算步骤。 - ...

    基于PHP的国内邮编区号查询PHP版源码.zip

    PHP的字符串处理函数(如explode()、trim())和数组操作函数(如array_map()、array_filter())在此过程中发挥重要作用。 4. 查询接口:创建一个PHP脚本来处理HTTP请求,接收用户的查询参数(如邮编或区号),并...

    phpexcelreader读取excel自动生成表和字段

    这个工具在Web开发中十分实用,尤其在数据迁移、数据分析或自动化报告生成等场景下。 首先,我们来了解一下`phpexcelreader`。这是一个开源项目,主要功能是解析Microsoft Office Excel 97-2003(.xls)格式的文件...

    jmesa 入门

    JMESa(Java Message Expression Language for SQL Access)是一种用于在Java应用程序中查询和操作数据库的开源工具。它提供了一种简洁、强大的方式来表达SQL查询,使得开发者可以更方便地与数据库进行交互。本文将...

    Hive用户指南(Hive_user_guide)_中文版

    Hive的主要功能在于提供了一个友好的数据处理接口,使得非编程人员也能使用SQL-like语句来处理Hadoop集群中的大规模数据。 **1.3 Hive和普通关系数据库的异同** - **相同点**:都支持SQL-like的查询语言;都可以...

    dojo utils tools with datas

    5. **dojo/data**: 这是Dojo的早期数据绑定API,虽然现在已经被dojo/store取代,但在某些老版本的Dojo项目中仍然可见。 6. **dojo/aspect**: 提供面向切面编程(AOP)的功能,可以用于在方法调用前、后或异常时插入...

    SparkSQL-DataFrame

    在SparkSQL中,DataFrame是一个不可变的数据结构,它是由一系列的列组成,每列都有自己的名字和数据类型。DataFrame的底层实现基于Spark的RDD(弹性分布式数据集)和Dataset,这使得DataFrame具有高度优化的执行计划...

    在Android和PHP Web服务之间发送和接收JSON

    在Android和PHP之间进行数据交互时,JSON(JavaScript Object Notation)是一种常用的数据交换格式,因为它的轻量级、易读、易写特性使得它在跨平台通信中扮演了重要角色。本文将深入探讨如何在Android应用中通过...

    PHP ORM(面向对象PDO数据库框架&API框架)

    $type_field_map = array( 1 => User::$field_username, 2 => User::$field_email, 3 => User::$field_phone ); if ($type == 2 && !is_email($value) || $type == 3 && !is_mobilephone($value)) { die_...

    Spark 编程基础(Scala 版)-机房上机实验指南

    - **数据类型**:Scala支持丰富的数据类型,包括基本类型(如Int、Double等)和复合类型(如List、Array等)。 - **控制结构**:提供if-else语句、for循环等基本控制结构。 - **函数式编程**:支持高阶函数、模式...

    expired_domain_name

    过期域名查询程序是互联网行业中一个非常实用的工具,尤其对于域名投资者而言,它可以帮助用户发现即将或已经过期的域名,以便抓住投资机会。PHP作为一款广泛应用的服务器端脚本语言,是实现这类程序的理想选择。在...

Global site tag (gtag.js) - Google Analytics