知识点:
array类型:
使用的时候,使用下标形式取数,生成的时候,使用array()函数生成
MAP类型:
使用的时候,使用字段['key']形式取数,生成的时候,使用str_to_map()函数生成,MAP是key value形式组成
struct类型:
使用的时候,使用字段.属性的形式取数,生成的时候,使用named_struct()函数生成
get_json_object:使用的时候,使用get_json_object(字段,'$.属性')形式取数,生成的时候,拼接string类型字段拼接为{"key":value,"key1":value1}形式
get_json_object
- 语法:get_json_object(json_string, '$.key')
- 说明:解析json的字符串json_string,返回path指定的内容。如果输入的json字符串无效,那么返回NULL。这个函数每次只能返回一个数据项
json_tuple
- 语法: json_tuple(json_string, k1, k2 ...)
- 说明:解析json的字符串json_string,可指定多个json数据中的key,返回对应的value。如果输入的json字符串无效,那么返回NUL
json_tuple相当于get_json_object的优势就是一次可以解析多个json字段。但是如果我们有个json数组,这两个函数都无法处理。
lateral view通常和UDTF一起出现,为了解决UDTF不允许在select存在多个字段的问题
实操:
-- 生成map
select map("pay_order_cnt", 10, "pay_order_amt", 1000)
--建表
create table mapkey1
(
id string,
field1 map<string,string>
)
row format delimited fields terminated by ','
collection items terminated by "|"
map keys terminated by ":";
insert into mapkey1(id, field1)
values (1, str_to_map("name:zhangsan,age:25")),
(2, str_to_map("name:lisi,age:23"));
select *
from mapkey1;
-- 列转行 lateral view explode(field1) 虚拟表名 as 虚拟字段
select id, k, v
from mapkey1 lateral view explode(field1) infos as k, v;
-- 根据key查询
select field1["name"] as name, field1["age"] as age
from mapkey1;
select *
from mapkey1
where field1["age"] > 23;
-- 查map中所有key
select map_keys(field1)
from mapkey1;
-- 查map中所有value
select map_values(field1)
from mapkey1;
-- key ,value 分列显示 列转行
select explode(field1)
from mapkey1;
--是否存在指定的key
select array_contains(map_keys(field1), 'id')
from mapkey1;
select array_contains(map_keys(field1), 'age')
from mapkey1;
-- struct
CREATE TABLE test_struct
( id int, course struct<course:string,score:int>
);
insert into table test_struct values ('1' ,named_struct('course','中文','score',88));
insert into table test_struct values ('4' ,named_struct('course','ant','score',100));
select * from test_struct;
-- 处理json
select
get_json_object('{"name":"zhangsan","age":18}','$.name'),
get_json_object('{"name":"zhangsan","age":18}','$.age');
select id, b.name,b.age
from test_struct a lateral view
json_tuple('{"name":"zhangsan","age":18}','name','age') b as name,age;