Spark 列转行操作
前言
在MySQL和oracle中有列转行函数用于将列转成行。在大数据SQL中也有类似的操作。这里主要讲解Spark的列转行操作。
欢迎关注微信公众号:大数据报文
concat:多列合并
在介绍列转行之前首先要说一下concat
函数,为后面列转行做一下铺垫:
-- mysql:可以一到合并多个值,无法使用分隔符,如果合并的值中有null,则合并的结果为nullselect concat('11','22',null);--mysql:可以合并多个值,第一个参数是分隔符。如果有null则忽略null合并其他值select concat_ws(',','11','22',null);--oracle:只能连接两个字符串,如果有一个是null,则结果是非null的值select concat('111',null) from dual;
Spark的concat函数:
--spark sql:与mysql的规则相同orclDF.select(concat($"CERT_NO", lit(null))).show()
concat_ws:单列转行
RDBMS SQL
-- mysql:有null值忽略,加distinct参数可以在列转行之前去重select name,group_concat(age) from student group by name;select name,group_concat(DISTINCT age) from student group by name;--去重select id,group_concat(name separator ';') from aa group by id;--以逗号分割select id,group_concat(name order by name desc) from aa group by id;--按合并字段排序-- Oracle:合并多列默认以逗号分隔select ci_id,wm_concat(stu_name) nameslist from student group by ci_id;--将两列合并为一列再列转行select ci_id,wm_concat(stu_name || '-' || stu_age) nameslist from student group by ci_id;
Spark SQL
//spark sql:要稍微复杂一点,要使用多个函数配合
//首先分组以后,肯定是要用聚合函数的,sparksql列转行的算子叫concat_ws,第一个参数是分隔符,如果不需要刻意写空字符串,但是必须指定。第二个参数分组之后dept列的列表。如果是collect_set,表示集合,即后者表示对组内的值去重orclDF.select($"id", $"dept", $"dest").groupBy($"id").agg(concat_ws("&", collect_list("dept"))
//通过上面这种方式可以达到上面RDBMS SQL的效果,但是如果合并两列就有些麻烦了,他没有合适的连接符
//下面这种方式,先合并了col1,再合并col2,如果要(col1[1]+col2[1])(col1[2]+col2[2])去合并需要使用concat函数orclDF.select($"id", $"dept", $"dest").groupBy($"id").agg(concat_ws("&", collect_list("col1"),collect_list("col2")) -- 下面这种方式是先将两列(应该说三列)合并为一列再列转行orclDF.select($"id", $"date", concat($"dept", lit("|"), $"dest").as("track")).groupBy($"id").agg(concat_ws(",", collect_list("track")).as("tracks"))
//上面也可以这样写
val testDF = orclDF.select($"id", $"name", $"score1", $"score2").groupBy($"id").agg(concat_ws(";", collect_list(concat($"score1",lit(","),$"score2"))).as("scores"))
总结
Spark SQL的列转行稍微有些复杂,但是逻辑很清晰,本质上还是与传统列转行一样,只是通过这种半编程方式实现起来相对而言稍显复杂。
另外最近复习Spark的一点感触。Spark SQL虽然不是传统sql,但是已经十分接近传统SQL的功能了,绝大多数传统SQL,Spark SQL都有实现。而且DataSet拥有类RDD编程的便利,可以说某些方面Spark SQL要比传统SQL灵活很多。
Spark 列转行操作相关推荐
- python列转行函数_Python pandas 列转行操作详解(类似hive中explode方法)
最近在工作上用到Python的pandas库来处理excel文件,遇到列转行的问题.找了一番资料后成功了,记录一下. 1. 如果需要爆炸的只有一列: df=pd.DataFrame({'A':[1,2 ...
- 将Excel文件导入到MySQL数据库中并实现列转行操作
在处理数据的时候,因为数据源在Excel文件中,本人Excel文件的处理方法不是太会,加上朋友说在Excel中处理这样的数据很麻烦,我就想着干脆导入到数据库中通过代码解决这个问题,感兴趣的可以找我拿数 ...
- SQL行转列,列转行
我们都知道在sql查询中,union 是增行,join是增列,但是如果碰到需要行转列,列转行时,一味的使用 join来完成则会变的异常繁杂.如把一天24小时的行转换成列,则需要join24次,既不方便 ...
- MySQL数据库行转列,列转行
一,MySQL行转列 导入数据表数据 CREATE TABLE `tb_student_grade` (`id` int(0) NOT NULL AUTO_INCREMENT,`s_name` var ...
- oracle系列–行转列、列转行
oracle行转列.oracle列转行 以及 mysql列转行,mysql行转列 文章目录 前言 一.oracle:逗号分隔的一列转行 二.oracle:多列转行 unpivot 函数 三.oracl ...
- Spark Sql对列的操作
SQL写得好,工作随便找 本篇博客讲的是关于Spark SQL中对于列的操作.在SQL中对列的操作有起别名,转化类型等在Spark SQL中同样也支持,下面来看一看把 Spark withColumn ...
- 张同学的 SQL中对材料报价单的数据权限进行操作 (如列转行 行转列的处理) 学习一下....
SQL中对材料报价单的数据权限进行操作 (如列转行 行转列的处理) --可以直接放到查询分析器执行 --判断测试表TmpTCIQuote是否有存在 不存在则创建 if NOT exists (sele ...
- oracle+行换列,Oracle的数据表中行转列与列转行的操作实例讲解
行转列一张表 查询结果为 --行转列 select years,(select amount from Tb_Amount as A where month=1 and A.years=Tb_Amou ...
- Python操作EXCEL列转行
文章目录 前言 一.业务场景 二.使用步骤 1.引入库 2.读入数据 3.输出数据 总结 前言 一.业务场景 业务整理了工艺的模板需要导入到系统中,但是系统中的表结构是工序只有一个列,不同值按行分开, ...
最新文章
- dev c++ 最新版本5.0
- 使用dubbo需要导入的jar包
- Swift中的Sequence基本的使用
- python下载大文件mp4_Python 下载 m3u8 格式视频
- 目标检测——如何处理任意输入尺寸的图片
- java模板变量_IntelliJ IDEA实时模板变量
- grafana+zabbix 部署分布式监控系统
- 如何证明永动机不可能制造出来
- 大数据实效_新都区:运用“大数据”提升专项巡察实效
- 安卓抓包工具、方式选择
- 数据结构PTA 案例6-1.3 哥尼斯堡的“七桥问题”
- vbox虚拟机与主机互传文件的四种方法
- 万字总结,行业分析到底应该怎么做!
- 关于hping打流测试工具
- L2-3 清点代码库【STL】
- Linux常用命令一览表
- 为什么是百度先造出了“知识型网红”
- Centos7中设置代理的方法
- CUMT数据库SQL实验
- 杂项-Grunt:grunt build 打包和常见错误
热门文章
- Android根据图片路径获取图片名字
- error:jump to case label [-fpermissive]
- P5200 [USACO19JAN]Sleepy Cow Sorting
- 第四章 Caché 设计模式 代理模式
- 怎么查看一段时间的计算机ip,如何查看电脑中使用过的历史IP地址
- 3735平板装win和linux双系统,流行的就一定好?浅谈双系统平板的利与弊
- 09静态资源虚拟主机
- 个人网站搭建,个人网站需要什么软件
- 探秘varian:优雅的发布部署程序
- 与语音信号处理有关的java书籍_MATLAB在语音信号分析与合成中的应用 中文pdf扫描版[198MB]...