首先创建一个测试数据

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行列转换相关推荐

  1. [转载]SQL Server行列转换实现

    一.Pivot和UnPivot介绍 1.Pivot介绍 PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PIVO ...

  2. SQL Server 行列转换(2)

    参考前一个例子http://www.cnblogs.com/insus/articles/1969896.html,现想使用另外一种方式来处理行列转换,实现下面效果: 参考代码: View Code ...

  3. Oracle 行列转换总结

    行列转换包括以下六种情况: *列转行 *行转列 *多列转换成字符串 *多行转换成字符串 *字符串转换成多列 *字符串转换成多行 下面分别进行举例介绍. 首先声明一点,有些例子需要如下10g及以后才有的 ...

  4. SAP行列转换的一个方法

    经常会遇到行列转换的需求.于是就找到了这样的一段代码.虽然也有其他的转换方法.但是都没有及时的记录.于是 就想起了将这段经典代码写在这里. TABLES spfli. data:     it_dat ...

  5. SQL语句行列转换两种方法 case ...when 和pivot函数应用

    2019独角兽企业重金招聘Python工程师标准>>> SQL语句行列转换两种方法 case ...when 和pivot函数应用SQL语句行列转换两种方法 case ...when ...

  6. DataStage系列教程 (Pivot_Enterprise 行列转换)

    有人提到Pivot_Enterprise这个组件,之前没有用过,今天捣腾了会,写下来供以后参考,如果有什么不对的,还请多指出,谢谢! Pivot_Enterprise主要用来进行行列转换. 1 示例 ...

  7. 用python做数据分析(行列转换)

    python行列转换 用reshape是有问题的,因为这是根据一个顺序的数进行遍历的 但是,用下面这个函数就有了对应的操作 C:\Users\Administrator>python Pytho ...

  8. SQL Server 2005之PIVOT/UNPIVOT行列转换

    SQL Server 2005之PIVOT/UNPIVOT行列转换 作者: NinGoo(http://ningoo.itpub.net) 发表于: 2007.04.18 11:49 分类: SQL ...

  9. 在Sqlserver下巧用行列转换日期的数据统计

    在Sqlserver下巧用行列转换日期的数据统计 原文:在Sqlserver下巧用行列转换日期的数据统计 在Sqlserver下巧用行列转换日期的数据统计 前言 在SQLSERVER 中有很多统计函数 ...

最新文章

  1. 【分享】计算机视觉方向必备opencv基础知识总览
  2. AFNetworking 源代码分析
  3. 一行代码快速搞定Flowable断点下载(下)
  4. pi节点虚拟服务器怎么弄,pi怎么用云服务器做节点
  5. 降Mail十八章(下)
  6. apache rewrite 二级域名
  7. 牛客算法周周练4 题解
  8. mybatis 查询之神坑
  9. eslint 保存自动格式化_代码规范之理解ESLint、Prettier、EditorConfig
  10. Shell编程:Bash引号的那点事
  11. 用vim替代source insight
  12. fckeditor组件使用---配置FCKeditor,以及使用方法2
  13. python简单超级马里奥游戏下载大全_Python实现超级玛丽游戏系列教程02玛丽走跑...
  14. avue-crud属性说明
  15. linux中mysql不显示中文_linux中解决mysql中文乱码方法
  16. 同一个项目,项目名称不一致,这两个项目同时在Eclipse中出现
  17. 基于java客户关系管理系统
  18. 理正深基坑6.0软件备忘录_梳理使用方法01
  19. 一些模板(按字典序排序)
  20. CHD6.3.1部署文档

热门文章

  1. pinia简介和setup语法糖
  2. 虚拟专用网连接异地机房部署方案
  3. 2021-04-09编程求1000以内的所有“完数”。所谓“完数”是指一个数恰好等于它的因子之和。例如,6是完数,因为6=1+2+3
  4. 转身以及低眉侧目 开始
  5. 树莓派组装成linux电脑,可放进口袋基于树莓派的GNU/Linux电脑
  6. 关于robocopy命令的使用
  7. 邻居好多用万能钥匙连我家WiFi的,我家的网速变得太慢,怎么才能避免?
  8. KITTI 数据集--下载链接
  9. 一座海岛,被互联网改造成了理想之地
  10. MediaCodec解码P010,OpenGLSL.texelFetch读取非归一化纹素。