一、SQL字段中的复杂结构体
如举例字段event_params类型为:
array<struct<key:string,string_value:string,int_value:bigint,double_value:double>>
event_params字段值为:
如果想取其中的“key”:
select event_params[0].key from tables;
二、常用复杂函数的解释
1、transform():将一个数组转换为另一个数组。
该函数会对数组中的每个元素应用func函数,并返回一个新的数组,其中只包含满足func函数条件的元素。
语法:
transform(expr, func)
参数:
- expr表示一个数组表达式。
- func表示一个函数表达式。
示例:获取event_params字段的key
select transform(event_params, param->param.key) as event_params_key
from dc_database."data_mobile_quality"
limit 10
2、map():将一组键值对映射到一个新的键值对集合。
语法:
MAP(key_expression, value_expression [, key_expression, value_expression]...)
参数:
- key_expression:表示键的表达式。
- value_expression:表示值的表达式。
示例:返回event_params字段中key、string_value组成的map
select map(
transform(event_params, param->param.key),
transform(event_params, param->param.string_value)
) as event_params_map
from dc_database."data_mobile_quality"
limit 10
3、map_filter(expr, func)函数是一种用于处理数组的函数。
该函数会对数组中的每个元素应用func函数,并返回一个新的数组,其中只包含满足func函数条件的元素。
语法:
map_filter(expr, func)
参数:
- expr表示一个数组表达式。
- func表示一个函数表达式。
示例:返回event_params字段中key、string_value组成的map,并且map的key只能为‘total’,‘avail’。
select map_filter(
map(
transform(event_params, param->param.key),
transform(event_params, param->param.string_value)
),
(k, v)->k in ('total', 'avail')
) kv
from dc_database.data_mobile_behavior
where any_match(event_params, param->param.key = 'total')
and any_match(event_params, param->param.key = 'avail')
limit 10
这里为什么要加where中的条件?
where any_match(event_params, param->param.key = 'total')
and any_match(event_params, param->param.key = 'avail')
该条件表示event_params不能为空,并且必须同时包含key为total、avail的元素。见下一个函数。
如果不加该条件返回的结果是这样的:
4、boolean any_match(array , function<T, boolean> )
判断Array数组a中是否存在元素满足predicate。
返回值说明
- 如果ARRAY数组a中存在一个或多个元素满足predicate条件,返回结果为True。
- 如果ARRAY数组a中没有元素满足predicate条件或ARRAY数组为空,返回结果为False。
- 如果ARRAY数组a中存在元素为NULL,且其他元素都不满足predicate条件,返回结果为NULL。
示例
where any_match(event_params, param->param.key = 'screen')
and any_match(event_params, param->param.key = 'charge')
and any_match(event_params, param->param.key = 'duration')
该条件event_params不能为空,且key必须同时有’screen’、‘charge’、‘duration’。