天天看点

大数据开发第11课 hive DQL数据查询语言-map-struct-json

作者:anjunact

知识点:

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;