SQL数组常用函数记录(Map篇)

MAP又被称为字典,格式如{key1:value1,key2:value2,...}形式,一般以k:v成对出现。

1、map构造

复制代码
map('7',coalesce(trade_info.7d_order,0),
        '14',coalesce(trade_info.14d_totalt,0),
        '28',coalesce(trade_info.28d_total,0),
) AS last_nday_total,

-- 建表时的字段类型
`last_nday_total`      map<string,bigint> COMMENT '近N天单量(N可取7,14,28)' , 

输出实例

复制代码
{
  "14": 7,
  "28": 11,
    "7": 3
}

2、获取map获取map字段的所有key值,或者所有value值

map_keys(map字段) -- 返回map字段里所有的key值,输出为数组

--> 输出示例:"14","28","180","365","7","90","60","30"

map_values(map字段) -- 返回map字段里左右的value值,输出为数组

--> 输出示例:7,11,34,116,3,20,18,11

3、获取map字段中其中一个value值

last_nday_total'28' --> map字段'对应的key'

--> 输出 11

4、将字符串转换为map格式

str_to_map(字符串字段str) -- 注意:字符串转换为map格式时,默认以英文逗号为分隔,key与value成对出现

-- 示例

str_to_map('"SH":1000,"SZ":980')

--> {"SH":1000,"SZ":980}

str_to_map(regexp_replace(concat_ws(',',collect_set(if(decisionids <> '',concat(cast(sceneid as string),':',regexp_replace(decisionids,'\,','\;')),null))),'\"|\{|\}','')) -- 行合并,并且生成一个map字段

5、将json转换为map格式

str_to_map('{"SH":1000,"SZ":980}')

--> {"SH":1000,"SZ":980}

6、求map字段的长度或元素个数

size(map字段)

7、将map字段中空值或无效值过滤掉

map_filter(map字段, (k, v) -> v IS NOT NULL) -- 将map字段中的value值为NULL的过滤掉

map_filter(map字段, (k, v) -> v <> '') -- 将map字段中的value值为空字符串的过滤掉,以此类推

map_filter(map字段, (k, v) -> k <> '') -- 将map字段中的key值为空字符串的过滤掉,以此类推

8、在map字段中新插入元素

-- 已知已有一个map字段score {"Chinese":"98"},请在里面再插入一个新元素,key为"Math",value为"99"

-- 方式1:

先将原有map字段拆开,再添加新元素。对原map字段元素多不好操作,且后续有变化难维护

map('Chinese','98',

'Math','99'

)

-- 方式2:

待补充

9、已知两个数组array分别是map的key值与value值,其中k/v数组元素顺序保持映射不变,将其还原为map格式字段

-- 已知map key数组与map value数组分别为:

map key数组:'Chinese','Math'

map value数组:'98','99'

-- 将其合并为一个map字段,输出为 {"Chinese":"98","Math":"99"}

-- 方式1:

将数组全部拆开为单元素,进行k/v交替映射,输出map字段。对于多元素难操作

map(key0,value0,

key1,value1

10、将多个map字段合并,例如在多行合并时存在map字段

-- 方式1:

先将map字段转换为json,。使用udf:to_json将map转换为json字符串,再利用行合并函数collect_set(),最终再将string转换为map

ADD jar hive-udf-tojson.jar;

CREATE TEMPORARY FUNCTION to_json as 'com.meituan.hive.udf.generic.GenericUDFToJson';

select str_to_map(regexp_replace(concat_ws(',',collect_set(to_json(factor_context))),'\{|\}|\"','')) as factor_context;

-- 方式2:

待补充,可参考https://www.saoniuhuo.com/question/detail-2046136.html

参考:

hive:将两个Map合并到一列中_大数据知识库

https://www.zhihu.com/question/384904689/answer/1126084222

相关推荐
鼎讯信通16 分钟前
风电光缆运维提质增效:G-4000A 光缆故障追踪仪破解风场巡检难题
运维·网络·数据库
三十..41 分钟前
MySQL 从入门到高可用架构实战精要
运维·数据库·mysql
fangdengfu1231 小时前
ES分析系统各个服务日志占用量
java·前端·elasticsearch
云烟成雨TD1 小时前
Spring AI 1.x 系列【51】可观测性技术选型
java·人工智能·spring
星越华夏1 小时前
ESP32-CAM图像传输项目说明文档
java·后端·struts·esp32
cfm_29141 小时前
Redis五大基本数据结构底层了解
数据结构·数据库·redis
Jinkxs2 小时前
Java 跨域14-Java 与区块链(Hyperledger)集成
java·开发语言·区块链
真实的菜2 小时前
Redis 从入门到精通(十二):典型业务场景实战 —— 排行榜、限流器、秒杀系统、Session 共享
数据库·redis·python
你想考研啊2 小时前
mysql数据库导出导入
数据库·mysql·oracle
晨曦中的暮雨3 小时前
Golang速通(Javaer版)
java·开发语言·后端·golang