Hive当中实现pivot操作

5 篇文章 0 订阅

0.背景

实际工作当中遇到这样一个问题,数据如下,但是我想通过SQL将数据转换成按列展示的形式,即常用的pivot透视操作。

# 原始数据
id item value
1  a    10 
2  b    21
1  b    15
2  a    20

# 次级目标格式(SQL)
id itemValue
1  a-10,b-15
2  a-20,b-21

# 目标格式
id item_a item_b(SQL + Python)
1  10     15
2  20     21

在Pandas中有pivot以及pivot_table可以实现相关的功能。但是如果原始数据是在服务器或者集群上,将原始数据pull到本地有时是一个代价非常高的事情。并且如果可以通过sql实现pivot操作,在我们多表join的时候也会非常方便。

1.操作

需要用到的hive操作有,concat,concat_ws,collect_set,group by。

1.1 首先使用concat将item和value连接起来,concat(item, '-', value)

a-10
b-20
b-15
a-20

1.2 利用collect_set进行去重(因为我们是通过group by进行的数据聚合,其他字段可能可以区分这些重复的数据,如下),并且将同属于一个id的值形成一个set类型,方便concat_ws连接。

# 我们使用id进行group by,连接item和value会有重复,collect_set可以去掉这些重复的。
# 但是这个需要谨慎,如果other字段也是重要的区分字段,把other也加入到group by的字段里。
id item value other
1  a    10    x
1  a    10    y

1.3 使用concat_ws拼接,拼接的字符一般要和concat拼接那个不一样。注意group by分组,这里是group by id。也可以用多个字段进行group by。

数据结果如下:

id itemValue
1  a-10,b-15
2  a-20,b-21

2.SQL

SELECT
    id,
    concat_ws(',', collect_set(concat(item, '-', value)))
FROM test_table
GROUP BY id

3.最终格式

如果想要处理成pivot table那种形式,可以拉到本地进行一些处理。这样做的主要好处是方便和其他表进行join。

4.Reference

1.https://blog.csdn.net/waiwai3/article/details/79071544

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
引用\[1\]中的代码是使用Spark SQL进行数据处理的示例代码,其中包括了连接表、排序、填充空值等操作。这段代码的目的是将数据写入HDFS中的文本文件。而引用\[2\]中的内容是关于Spark中foreachPartitions算子的性能优化的说明。该算子可以一次性处理一个partition的数据,从而减少了频繁创建和销毁数据库连接的开销,提高了性能。至于引用\[3\]中的内容,它是关于在Hive中使用pivot操作的问题。根据引用\[3\]中的代码示例,可以使用join和pivot函数来实现Hive中进行数据透视操作。 #### 引用[.reference_title] - *1* [pyspark案例系列7-通过dataframe的pivot实现行转列](https://blog.csdn.net/u010520724/article/details/125271441)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Spark性能优化指南——基础篇](https://blog.csdn.net/lvlei19911108/article/details/116375402)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Spark-SQL之DataFrame操作大全](https://blog.csdn.net/syc0616/article/details/115978961)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值