Sparksql行列转换
首先创建一个测试数据
from pyspark import SparkConf, SparkContext
from pyspark.sql import SparkSessionspark=SparkSession.builder.appName('TestAPP').enableHiveSupport().getOrCreate()df = spark.createDataFrame([('math','alice',88), ('chinese','alice',92), ('english','alice',77),('math','bob',65), ('chinese','bob',87), ('english','bob',90),('math','cary',67), ('chinese','cary',33), ('english','cary',24),('math','josh',77), ('chinese','josh',87), ('english','josh',90)], ['item','name','score']).orderBy('item')df.show()
+-------+-----+-----+
| item| name|score|
+-------+-----+-----+
|chinese| cary| 33|
|chinese|alice| 92|
|chinese| josh| 87|
|chinese| bob| 87|
|english| josh| 90|
|english| bob| 90|
|english| cary| 24|
|english|alice| 77|
| math|alice| 88|
| math| bob| 65|
| math| cary| 67|
| math| josh| 77|
+-------+-----+-----+
1.行转列通过pivot
有以下两种方式
方法一:
# 行转列
df.createOrReplaceTempView('scores')sql_content = '''select * from scores pivot(sum(score) forname in ('alice','bob','cary','josh')) '''
df_pivot = spark.sql(sql_content)
df_pivot.show()
+-------+-----+---+----+----+
| item|alice|bob|cary|josh|
+-------+-----+---+----+----+
|chinese| 92| 87| 33| 87|
|english| 77| 90| 24| 90|
| math| 88| 65| 67| 77|
+-------+-----+---+----+----+
方法二:
from pyspark.sql import functions as F
df.groupBy('item').pivot('name').sum('score').show()
+-------+-----+---+----+----+
| item|alice|bob|cary|josh|
+-------+-----+---+----+----+
|chinese| 92| 87| 33| 87|
|english| 77| 90| 24| 90|
| math| 88| 65| 67| 77|
+-------+-----+---+----+----+
2. 列转行通过stack
# 列转行
df_pivot.createOrReplaceTempView('v_pivot')sql_content = '''select item,stack(4, 'alice', alice, 'bob', bob, 'cary', cary, 'josh', josh) as (name, score )from v_pivot '''df_unpivot1 = spark.sql(sql_content)
df_unpivot1.show()
+-------+-----+-----+
| item| name|score|
+-------+-----+-----+
|chinese|alice| 92|
|chinese| bob| 87|
|chinese| cary| 33|
|chinese| josh| 87|
|english|alice| 77|
|english| bob| 90|
|english| cary| 24|
|english| josh| 90|
| math|alice| 88|
| math| bob| 65|
| math| cary| 67|
| math| josh| 77|
+-------+-----+-----+
实际生产上,需要转换的列很多的时候,可以通过如下方式处理
app_columns = [col for col in df_pivot.columns if col not in 'item']
app_columns
['alice', 'bob', 'cary', 'josh']
app_stack_str = ','.join(map(lambda x: "'%s', %s" % (x, x), app_columns))
app_stack_str
"'alice', alice,'bob', bob,'cary', cary,'josh', josh"
df_pivot1 = df_pivot.select(*[df_pivot[col_name].cast("string") for col_name in df_pivot.columns])
df_unpivot1 = df_pivot1.selectExpr("item", "stack(%s, %s) as (feature, value)" % (len(app_columns), app_stack_str))
df_unpivot1 .show()
+-------+-------+-----+
| item|feature|value|
+-------+-------+-----+
|chinese| alice| 92|
|chinese| bob| 87|
|chinese| cary| 33|
|chinese| josh| 87|
|english| alice| 77|
|english| bob| 90|
|english| cary| 24|
|english| josh| 90|
| math| alice| 88|
| math| bob| 65|
| math| cary| 67|
| math| josh| 77|
+-------+-------+-----+
Sparksql行列转换相关推荐
- [转载]SQL Server行列转换实现
一.Pivot和UnPivot介绍 1.Pivot介绍 PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PIVO ...
- SQL Server 行列转换(2)
参考前一个例子http://www.cnblogs.com/insus/articles/1969896.html,现想使用另外一种方式来处理行列转换,实现下面效果: 参考代码: View Code ...
- Oracle 行列转换总结
行列转换包括以下六种情况: *列转行 *行转列 *多列转换成字符串 *多行转换成字符串 *字符串转换成多列 *字符串转换成多行 下面分别进行举例介绍. 首先声明一点,有些例子需要如下10g及以后才有的 ...
- SAP行列转换的一个方法
经常会遇到行列转换的需求.于是就找到了这样的一段代码.虽然也有其他的转换方法.但是都没有及时的记录.于是 就想起了将这段经典代码写在这里. TABLES spfli. data: it_dat ...
- SQL语句行列转换两种方法 case ...when 和pivot函数应用
2019独角兽企业重金招聘Python工程师标准>>> SQL语句行列转换两种方法 case ...when 和pivot函数应用SQL语句行列转换两种方法 case ...when ...
- DataStage系列教程 (Pivot_Enterprise 行列转换)
有人提到Pivot_Enterprise这个组件,之前没有用过,今天捣腾了会,写下来供以后参考,如果有什么不对的,还请多指出,谢谢! Pivot_Enterprise主要用来进行行列转换. 1 示例 ...
- 用python做数据分析(行列转换)
python行列转换 用reshape是有问题的,因为这是根据一个顺序的数进行遍历的 但是,用下面这个函数就有了对应的操作 C:\Users\Administrator>python Pytho ...
- SQL Server 2005之PIVOT/UNPIVOT行列转换
SQL Server 2005之PIVOT/UNPIVOT行列转换 作者: NinGoo(http://ningoo.itpub.net) 发表于: 2007.04.18 11:49 分类: SQL ...
- 在Sqlserver下巧用行列转换日期的数据统计
在Sqlserver下巧用行列转换日期的数据统计 原文:在Sqlserver下巧用行列转换日期的数据统计 在Sqlserver下巧用行列转换日期的数据统计 前言 在SQLSERVER 中有很多统计函数 ...
最新文章
- 【分享】计算机视觉方向必备opencv基础知识总览
- AFNetworking 源代码分析
- 一行代码快速搞定Flowable断点下载(下)
- pi节点虚拟服务器怎么弄,pi怎么用云服务器做节点
- 降Mail十八章(下)
- apache rewrite 二级域名
- 牛客算法周周练4 题解
- mybatis 查询之神坑
- eslint 保存自动格式化_代码规范之理解ESLint、Prettier、EditorConfig
- Shell编程:Bash引号的那点事
- 用vim替代source insight
- fckeditor组件使用---配置FCKeditor,以及使用方法2
- python简单超级马里奥游戏下载大全_Python实现超级玛丽游戏系列教程02玛丽走跑...
- avue-crud属性说明
- linux中mysql不显示中文_linux中解决mysql中文乱码方法
- 同一个项目,项目名称不一致,这两个项目同时在Eclipse中出现
- 基于java客户关系管理系统
- 理正深基坑6.0软件备忘录_梳理使用方法01
- 一些模板(按字典序排序)
- CHD6.3.1部署文档
热门文章
- pinia简介和setup语法糖
- 虚拟专用网连接异地机房部署方案
- 2021-04-09编程求1000以内的所有“完数”。所谓“完数”是指一个数恰好等于它的因子之和。例如,6是完数,因为6=1+2+3
- 转身以及低眉侧目 开始
- 树莓派组装成linux电脑,可放进口袋基于树莓派的GNU/Linux电脑
- 关于robocopy命令的使用
- 邻居好多用万能钥匙连我家WiFi的,我家的网速变得太慢,怎么才能避免?
- KITTI 数据集--下载链接
- 一座海岛,被互联网改造成了理想之地
- MediaCodec解码P010,OpenGLSL.texelFetch读取非归一化纹素。