| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> 【spark】行列互转的思考 -> 正文阅读 |
|
[大数据]【spark】行列互转的思考 |
一、背景群里有个小伙伴出了一道题目是行转列(多行数据转成多列数据) 如图,把上表的数据通过sql变成下表的数据 当然实现方法还是比较多的,我也想了几种方式,并随便搞了2.5亿条数据测试下性能(表格式是text,每个文件块大小都很均匀) 二、实现方法不同引擎里,会有不同的函数或者语法做行列的转换,我这里就针对spark引擎来说,我的测试环境是spark-3.1.2,我想到了几种方法来解这道题,包括最简单的CASE WHEN,STACK,LATERAL VIEW EXPLODE,包括在2.4左右的版本才添加的PIVOT(类似excel的透视方法),下面我来说说我的三种想法和实现 数据初始化:
1、CASE WHEN这个语法我应该不用过多阐述,非常基础的行转列操作
处理时长:1.3min 2、LATERAL VIEW EXPLODE + PIVOTpivot语法,是将如下格式转换为最终的结果,所以要思考怎么将数据处理成如下格式,在方案二里用的是字段拼接(concat)把code和weight的key和值都拼到一起,再加上LATERAL VIEW EXPLODE把数据拆成多行 具体处理过程,大家可以把sql一段一段执行下看看结果是什么
?
处理时长:10min? 3、STACK +?PIVOT最后一种是和第二种其实差不多,核心都是用pivot做最后一步处理,只是将数据转成pivot能处理的数据的方式不同,使用的是stack
处理时长:5min(我多跑了几次,有的是4.9min,截图是5.2min)? 三、介绍下函数LATERAL VIEW EXPLODE和CASE WHEN我想大家应该都很常见了 主要说说PIVOT和STACK这两个比较少见的 1、PIVOT我想官方文档其实介绍的比较清楚了,大家看下面官方文档的链接就可以了 sum(value)是每个单元格填的值,for后面是把atrribute_key字段中每一种可能都作为单独的一列 当然sql写的时候,需要把所有的列的值都写出来,如果用spark的DSL的语法写的话,不需要全部列出来,对于值不确定,不清楚会有几列的场景,就比较友好了~
2、STACK这个函数其实官方手册里没有写的很明白到底怎么用 我来解释下,stack方法,会使得一行数据变多行,并且该函数会返回多列 我总共传了5个参数,第一个参数是个数字,说明要把一行数据拆成几行 后面传入的参数依次是,第一行的第一列填入什么内容,第一行的第二列填入什么内容,在我的case中,第一行的第一列填入的是people字段的值和“_”和“code”拼接,会变成“y_code”,然后第一行的第二列填入code的值 再接着后面两个参数分别是:第二行的第一列填入什么内容,第二行的第二列填入什么内容 所以原来的表,就会转换成如下的样子 四、总结其实用了几个比较少见的花里胡哨的函数或者语法,这些函数还不一定每个计算引擎/数据库里都有,反而会带来切换引擎时的有缝切换,其实这并不是我们想看到的,因为建议大家在写sql的时候,尽量还是写些通用的语法,减少切换引擎的工作量,并且我们看到在这个例子中,CASE WHEN的性能是最好的,1.3min就跑完了,其次是STACK,最差的是LATERAL VIEW EXPLODE 所以如果列数确定,直接case when就得了,不确定的情况下,又有spark较新的版本,可以使用DSL语法实现pivot与stack结合使用
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 9:13:16- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |