文章目录
Hive系列文章
Hive系列 (八):Hive中的explode 与 lateral view
概述
explode 和 lateral view经常放在一起用,它们的出现本身就是在操作不满足第一范式的数据,在大数据技术中,很多类似pv,uv的数据,在业务系统中是存贮在非关系型数据库中,用json存储的概率比较大,直接导入hive为基础的数仓系统中,就需要经过ETL过程解析这类数据,explode与lateral view在这种场景下大显身手。
explode用法
select explode(mapcol) as (keyname,valuename) from tablename;
- explode():函数中的参数传入的是map数据类型的列名。
- 由于map是kay-value结构的,所以它在转换的时候会转换成两列,一列是kay转换而成的,一列是value转换而成的。
- keyname:表示key转换成的列名称,用于代表key转换之后的列名。
- valuename:表示value转换成的列名称,用于代表value转换之后的列名称
注意事项
- 不能关联原有的表中的其他字段。
- 不能与group by、cluster by、distribute by、sort by联用。
- 不能进行UDTF嵌套。
- 不允许选择其他表达式
explode操作Array
0: jdbc:hive2://master:10000> select * from myhive.array_test;
OK
+----------------+--------------------------+
| array_test.id | array_test.info |
+----------------+--------------------------+
| [1,2,3,4] | ["you","are","a","boy"] |
| [5,6,7,8] | ["she","is","a","girl"] |
+----------------+--------------------------+
2 rows selected (6.983 seconds)
0: jdbc:hive2://master:10000> select explode(info) from myhive.array_test;
OK
+-------+
| col |
+-------+
| you |
| are |
| a |
| boy |
| she |
| is |
| a |
| girl |
+-------+
8 rows selected (3.432 seconds)
explode操作Map
0: jdbc:hive2://master:10000> select * from myhive.map_test;
OK
+--------------+-------------------+-------------------+
| map_test.id | map_test.int_map | map_test.str_map |
+--------------+-------------------+-------------------+
| 12 | {
"年龄":18,"性别":1} | {
"姓名":"张三"} |
+--------------+-------------------+-------------------+
1 row selected (3.371 seconds)
0: jdbc:hive2://master:10000> select exp
explain export expression
0: jdbc:hive2://master:10000> select explode(str_map) as (key_name,value_name) from myhive.map_test;
OK
+-----------+-------------+
| key_name | value_name |
+-----------+-------------+
| 姓名 | 张三 |
+-----------+-------------+
1 row selected (3.227 seconds)
0: jdbc:hive2://master:10000>
explode配合解析Json
建表
创建表json_test, 建表脚本如下:
# 文件名crt_book_info_json.sql
create