在复杂的业务场景下,日志字段的值可能为数组(array)、对象(map)等类型。对这种特殊类型的日志字段进行查询和分析时,您可以先使用UNNEST子句将字段值展开。

语法

  • 将array类型的数据展开为多行单列形式,列名为column_name
    UNNEST(x) AS table_alias(column_name)
  • 将map类型的数据展开为多行多列形式,列名为key_namevalue_name
    UNNEST(y) AS table(key_name,value_name)
注意 UNNEST子句处理的是array或者map类型的数据。如果您输入的数据为字符串类型,则需要先转化为JSON类型,然后再转化为array类型或map类型,转化方法为try_cast(json_parse(array_column) as array(bigint))。更多信息,请参见类型转换函数

参数说明

参数 说明
x 数据类型为array类型。
column_name 将array类型的数据展开后,指定一个列名。该列用于存放array中的元素。
y 数据类型为map类型。
key_name 将map类型的数据展开后,指定一个列名。该列用于存放map中的键。
value_name 将map类型的数据展开后,指定一个列名。该列用于存放map中的键值。

示例

示例1

number字段的值(array类型)展开为多行单列形式。

  • 字段样例
    number:[49, 50, 45, 47, 50]
  • 查询和分析语句
    * |
    SELECT
      a
    FROM  log,
      UNNEST(cast(json_parse(number) AS array(bigint))) AS t(a)
  • 查询和分析结果unnest

示例2

number字段的值(array类型)展开为多行单列形式,并进行求和计算。

  • 字段样例

    此处仅提供一条日志样例,求和计算是针对所有日志,即对所有日志中的number字段的值进行求和。

    number:[49, 50, 45, 47, 50]
  • 查询和分析语句
    * |
    SELECT
      sum(a) AS sum
    FROM  log,
      UNNEST(cast(json_parse(number) as array(bigint))) AS t(a)
  • 查询和分析结果unnest

示例3

number字段的值(array类型)展开为多行单列形式,并对各个值进行分组统计。

  • 字段样例
    number:[49, 50, 45, 47, 50]
  • 查询和分析语句
    * |
    SELECT
      a, count(*) AS count
    FROM  log,
      UNNEST(cast(json_parse(number) as array(bigint))) AS t(a) GROUP BY a
  • 查询和分析结果unnest

示例4

number字段的值(map类型)展开为多行多列形式。

  • 字段样例
    result:{
      anomaly_type:"OverThreshold"
      dim_name:"request_time"
      is_anomaly:true
      score:1
      value:"3.000000"}
  • 查询和分析语句
    * |
    select
      key,
      value
    FROM  log,
      UNNEST(
        try_cast(json_parse(result) as map(varchar, varchar))
      ) AS t(key, value)
  • 查询和分析结果unnest

示例5

number字段的值(map类型)展开为多行多列形式,并对各个键进行分组统计。

  • 字段样例
    result:{
      anomaly_type:"OverThreshold"
      dim_name:"request_time"
      is_anomaly:true
      score:1
      value:"3.000000"}
  • 查询和分析语句
    * |
    select
      key,
      count(*) AS count
    FROM  log,
      UNNEST(
        try_cast(json_parse(result) as map(varchar, varchar))
      ) AS t(key, value)
    GROUP BY
      key
  • 查询和分析结果unnest

示例6

使用histogram函数获取各个请求方法对应的请求数量,返回结果为map类型。然后通过unnest子句将histogram函数的返回结果展开为多行多列形式,并通过柱状图展示。

  • 查询和分析语句
    * |
    SELECT
      key,
      value
    FROM(
        SELECT
          histogram(request_method) AS result
        FROM      log
      ),
      UNNEST(result) AS t(key, value)
  • 查询和分析结果unnest