hive函数之~hive当中的lateral view 与 explode

1、使用explode函数将hive表中的Map和Array字段数据进行拆分

  lateral view用于和split、explode等UDTF一起使用的,能将一行数据拆分成多行数据,在此基础上可以对拆分的数据进行聚合,lateral view首先为原始表的每行调用UDTF,UDTF会把一行拆分成一行或者多行,lateral view在把结果组合,产生一个支持别名表的虚拟表。

  其中explode还可以用于将hive一列中复杂的array或者map结构拆分成多行。

需求:现在有数据格式如下

zhangsan     child1,child2,child3,child4      k1:v1,k2:v2
lisi  child5,child6,child7,child8      k3:v3,k4:v4

  字段之间使用\t分割,需求将所有的child进行拆开成为一列

+----------+--+
| mychild  |
+----------+--+
| child1   |
| child2   |
| child3   |
| child4   |
| child5   |
| child6   |
| child7   |
| child8   |
+----------+--+

将map的key和value也进行拆开,成为如下结果

+-----------+-------------+--+
| mymapkey  | mymapvalue  |
+-----------+-------------+--+
| k1        | v1          |
| k2        | v2          |
| k3        | v3          |
| k4        | v4          |
+-----------+-------------+--+

第一步:创建hive数据库

创建hive数据库

hive (default)> create database hive_explode;
hive (default)> use hive_explode;

第二步:创建hive表,然后使用explode拆分map和array

hive (hive_explode)> create  table t3(name string,children array<string>,address Map<string,string>)
                    row format delimited fields terminated by '\t'
                    collection items terminated by ','
                    map keys terminated by ':' stored as textFile;

第三步:加载数据

node03执行以下命令创建表数据文件

mkdir -p /export/servers/hivedatas/
cd /export/servers/hivedatas/
vim maparray

zhangsan     child1,child2,child3,child4      k1:v1,k2:v2
lisi  child5,child6,child7,child8      k3:v3,k4:v4

hive表当中加载数据

hive (hive_explode)> load data local inpath '/export/servers/hivedatas/maparray' into table t3;

第四步:使用explode将hive当中数据拆开

将array当中的数据拆分开

hive (hive_explode)> SELECT explode(children) AS myChild FROM t3;

将map当中的数据拆分开

hive (hive_explode)> SELECT explode(address) AS (myMapKey, myMapValue) FROM t3;

2、使用explode拆分json字符串

需求:现在有一些数据格式如下:

a:shandong,b:beijing,c:hebei|1,2,3,4,5,6,7,8,9|[{"source":"7fresh","monthSales":4900,"userCount":1900,"score":"9.9"},{"source":"jd","monthSales":2090,"userCount":78981,"score":"9.8"},{"source":"jdmart","monthSales":6987,"userCount":1600,"score":"9.0"}]

其中字段与字段之间的分隔符是 |

我们要解析得到所有的monthSales对应的值为以下这一列(行转列)

4900
2090
6987

第一步:创建hive表

hive (hive_explode)> create table explode_lateral_view
                   (`area` string,
                   `goods_id` string,
                   `sale_info` string)
                   ROW FORMAT DELIMITED
                   FIELDS TERMINATED BY '|'
                   STORED AS textfile;

第二步:准备数据并加载数据

准备数据如下

cd /export/servers/hivedatas
vim explode_json
a:shandong,b:beijing,c:hebei|1,2,3,4,5,6,7,8,9|[{"source":"7fresh","monthSales":4900,"userCount":1900,"score":"9.9"},{"source":"jd","monthSales":2090,"userCount":78981,"score":"9.8"},{"source":"jdmart","monthSales":6987,"userCount":1600,"score":"9.0"}]

加载数据到hive表当中去

hive (hive_explode)> load data local inpath '/export/servers/hivedatas/explode_json' overwrite into table explode_lateral_view;

第三步:使用explode拆分Array

hive (hive_explode)> select explode(split(goods_id,',')) as goods_id from explode_lateral_view;

第四步:使用explode拆解Map

hive (hive_explode)> select explode(split(area,',')) as area from explode_lateral_view;

5.创建hive表并导入数据

创建hive表并加载数据

hive (hive_explode)> create table person_info(
                    name string,
                    constellation string,
                    blood_type string)
                    row format delimited fields terminated by "\t";
加载数据
hive (hive_explode)> load data local inpath '/export/servers/hivedatas/constellation.txt' into table person_info;

第五步:拆解json字段

hive (hive_explode)> select explode(split(regexp_replace(regexp_replace(sale_info,'\\[\\{',''),'}]',''),'},\\{')) as  sale_info from explode_lateral_view;

然后我们想用get_json_object来获取key为monthSales的数据:

hive (hive_explode)> select get_json_object(explode(split(regexp_replace(regexp_replace(sale_info,'\\[\\{',''),'}]',''),'},\\{')),'$.monthSales') as  sale_info from explode_lateral_view;

然后挂了FAILED: SemanticException [Error 10081]: UDTF's are not supported outside the SELECT clause, nor nested in expressions

UDTF explode不能写在别的函数内

如果你这么写,想查两个字段,select explode(split(area,',')) as area,good_id from explode_lateral_view;

会报错FAILED: SemanticException 1:40 Only a single expression in the SELECT clause is supported with UDTF's. Error encountered near token 'good_id'

使用UDTF的时候,只支持一个字段,这时候就需要LATERAL VIEW出场了

3、配合LATERAL  VIEW使用

配合lateral view查询多个字段

hive (hive_explode)> select goods_id2,sale_info from explode_lateral_view LATERAL VIEW explode(split(goods_id,','))goods as goods_id2;

其中LATERAL VIEW explode(split(goods_id,','))goods相当于一个虚拟表,与原表explode_lateral_view笛卡尔积关联。

也可以多重使用

hive (hive_explode)> select goods_id2,sale_info,area2
                    from explode_lateral_view
                    LATERAL VIEW explode(split(goods_id,','))goods as goods_id2
                    LATERAL VIEW explode(split(area,','))area as area2;
也是三个表笛卡尔积的结果

最终,我们可以通过下面的句子,把这个json格式的一行数据,完全转换成二维表的方式展现

hive (hive_explode)> select get_json_object(concat('{',sale_info_1,'}'),'$.source') as source,
                    get_json_object(concat('{',sale_info_1,'}'),'$.monthSales') as monthSales,
                    get_json_object(concat('{',sale_info_1,'}'),'$.userCount') as monthSales,
                    get_json_object(concat('{',sale_info_1,'}'),'$.score') as monthSales from explode_lateral_view
                    LATERAL VIEW explode(split(regexp_replace(regexp_replace(sale_info,'\\[\\{',''),'}]',''),'},\\{'))sale_info as sale_info_1;

总结:

Lateral View通常和UDTF一起出现,为了解决UDTF不允许在select字段的问题。 
Multiple Lateral View可以实现类似笛卡尔乘积。 
Outer关键字可以把不输出的UDTF的空结果,输出成NULL,防止丢失数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Hive 中的 lateral view explode 是用来将一个表中的一列数组类型的数据拆分成多行,每一行对应数组中的一个元素。这样可以方便地对数组中的元素进行计算和分析。使用方法如下: ``` SELECT ... FROM table_name LATERAL VIEW explode(array_column_name) exploded_table_alias AS column_alias ``` 其中 array_column_name 是数组类型的列名,exploded_table_alias 是拆分后的表的别名,column_alias 是拆分后新增的列的别名。 ### 回答2: Hive Lateral View ExplodeHive 的一种语法,可以将数组或者 Map 类型的列,展开成多行数据。Lateral View 关键字是用来处理嵌套类型的数据,而 Explode 函数可以将数组或 Map 类型的列展开成多行数据,每一行包含一组键值对或值。这个语法语句会将每个数组或 Map 对象分解成独立的行,其中包含了键和值。这样对于数组或 Map 中的数据就可以进行分组、过滤、排序等操作,这种方式可以方便的处理多类型数据。 它的基本语法如下: select a.id, b.device_name from user_info a lateral view explode(a.devices) b as device_name; 这个语句的主要作用是将 user_info 表中的 devices 列展开成多行数据,每行数据包含一个用户设备名称和设备id。此时,可以通过 device_name 字段来分组、过滤、聚合等操作,从而方便地对数据进行处理。Lateral ViewExplode 结合使用,可以方便的处理复杂数据类型,挖掘数据更深层次的信息,使数据分析更加高效、方便、精准。 总的来说,Hive Lateral View Explode 能够方便地将数组或 Map 类型的列进行展开,使得数据处理更加方便和高效。使用它可以应对各种统计需求,分析更加深入有效。同时也要注意到 Lateral View Explode 这种语法可能会影响计算效率,因此在实际的使用中需要仔细设计和优化查询语句,以提高计算效率。 ### 回答3: Hive Lateral View Explode 是在 Hive 中用于将一个数组或 Map 字段转换为行的扩展函数。它通过创建新行来展开数组或 Map 字段中的每个元素,以便更容易地进行查询和分析。 在 Hive 中,数组和 Map 字段是常见的数据类型,用于存储多个值或键值对。但是,这些类型常常难以查询和分析,因为它们不能直接展开成一些行。Lateral View Explode 解决了这个问题。它允许将数组和 Map 字段展开成多行,这样就可以更轻松地进行分析和查询。 使用 Lateral View Explode 函数,可以将数组字段展开成多行,每行包含数组中的一个元素。例如,假设有一个包含成绩的数组字段 grades,它包含多个数字。使用 Lateral View Explode 函数,可以将 grades 字段展开成新的一组行,每一行包含一个成绩。 另外,Lateral View Explode 也可用于 Map 字段,使每个键值对都展开成一行。Lateral View Explode 还可以与其他 Hive 函数结合使用,以进一步扩展查询。 总之,Lateral View ExplodeHive 中一个重要的扩展函数,它可将数组和 Map 字段转换成行,方便查询和分析。使用 Lateral View Explode 函数可以大大简化数据分析的过程,提高查询效率,并使数据更加有用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值