hive 行转列,列转行一些函数总结原创
数组函数collect_set
在Hive中,collect_set函数用于将某一列中的元素收集到一个集合中,并去除重复的元素。这个函数适用于处理需要对列中的元素进行聚合并获取唯一值的情况。
collect_set函数的语法如下:
collect_set(expression)
其中,expression是待聚合的表达式或列。该函数返回一个集合,其中包含了表达式或列中的所有唯一元素。
下面是一个示例来说明collect_set函数的用法:
假设我们有一个名为sales
的Hive表,其中有两列:order_id
和product_id
。我们想要找出每个订单中唯一的产品。我们可以使用collect_set函数来实现这个目标。
SELECT order_id, collect_set(product_id) AS unique_products
FROM sales
GROUP BY order_id;
以上查询将返回一个结果集,其中每一行代表了一个订单及其唯一的产品集合。结果集包括两列:order_id
列是订单号,unique_products
列是该订单中唯一的产品集合。
通过使用collect_set函数,我们可以方便地对列中的元素进行去重和聚合操作,从而得到想要的结果。这在需要获取唯一值或进行基于集合的分析时非常有用。
数组函数collect_list
在Hive中,collect_list函数用于将某一列中的元素收集到一个列表中,保留元素的顺序。这个函数适用于需要将列中的元素按照原始顺序进行聚合的情况。
collect_list函数的语法如下:
collect_list(expression)
其中,expression是待聚合的表达式或列。该函数返回一个列表,其中包含了表达式或列中的所有元素,并保留它们的顺序。
下面是一个示例来说明collect_list函数的用法:
假设我们有一个名为sales
的Hive表,其中有两列:order_id
和product_id
。我们想要找出每个订单中的所有产品,并按照原始顺序进行列出。我们可以使用collect_list函数来实现这个目标。
SELECT order_id, collect_list(product_id) AS all_products
FROM sales
GROUP BY order_id;
以上查询将返回一个结果集,其中每一行代表了一个订单及其包含的产品列表。结果集包括两列:order_id
列是订单号,all_products
列是该订单中的所有产品列表。
通过使用collect_list函数,我们可以方便地对列中的元素进行聚合操作,并保留它们的原始顺序。这在需要按照顺序收集元素或进行基于列表的分析时非常有用。
要保证列表有序只需要在生成列表后使用sort_array函数进行排序即可。sort_array就是对array进行排序,且只能升序。
SELECT
memberid,
regexp_replace(
concat_ws('-',
sort_array(
collect_set(concat_ws(':',cast(legcount as string),airways)
from
),'\d\:','') hs
select 1 as memberid,'A' as airways,2 as legcountunion ALL
select 1 as memberid,'B' as airways,3 as legcountunion ALL
select 2 as memberid,'C' as airways,4 as legcountunion ALL
select 2 as memberid,'D' as airways,1 as legcount
union ALL
select 2 as memberid,'D' as airways,1 as legcount
) as t
group by memberid
炸裂函数explode
Hive中的explode函数用于将数组类型的列展开成多行数据,每行包含数组中的一个元素。这个函数非常有用,因为它可以让我们在Hive查询中更方便地处理和分析包含数组的数据。
explode函数的语法如下:
explode(array<T>)
其中,array 是待展开的数组。该函数返回一个列,包含了数组中的每个元素。
下面是一个示例来说明explode函数的用法:
假设我们有一个名为orders
的Hive表,其中有两列:order_id
和items
。items
列是一个包含了订单中多个商品的数组。我们可以使用explode函数将每个商品展开为独立的行。
SELECT order_id, item
FROM orders
LATERAL VIEW explode(items) itemTable as item;
以上查询将返回一个结果集,其中每一行代表了orders
表中的一个商品。结果集包括两列:order_id
列是原始表中的订单号,item
列是具体的商品。
通过使用explode函数,我们可以将数组类型的列展开成单独的行,以便更方便地进行进一步的分析、聚合或筛选操作。这对于处理包含多个元素的数组数据非常有用。
带下标的炸裂函数posexplode函数
Hive的posexplode函数用于在Hive查询中展开数组并为每个数组元素生成一个唯一的位置索引。这个函数在每个元素和其对应的索引之间创建一个结构,使得我们可以更方便地处理和分析数组数据。
posexplode函数的语法如下:
posexplode(array<T>)
其中,array 是待展开的数组。该函数返回两个列,第一个列名为 pos
,表示数组元素的索引位置;第二个列名为 col
,表示数组中的具体元素。
下面是一个示例来说明posexplode函数的用法:
假设我们有一个名为employees
的Hive表,其中有两列:name
和skills
。skills
列是一个包含多个技能的数组。我们可以使用posexplode函数将每个技能展开为独立的行,并添加一个索引列。
SELECT name, pos, col as skill
FROM employees
LATERAL VIEW posexplode(skills) skillTable as pos, col;
以上查询将返回一个结果集,其中每一行都代表了employees
表中的一个技能。结果集包括三列:name
列是原始表中的员工名字,pos
列是技能在数组中的索引位置,skill
列是具体的技能。
通过使用posexplode函数,我们可以更灵活地处理包含数组的数据,并进行相应的分析和查询操作。