行列变换的相关

PIVOT

用户将多行转换成列。如果需要转换特定的行,则将行的值做为列表参数传入。

from pyspark.sql import SparkSession
import pyspark.sql.functions as F

spark = SparkSession.builder.master("local[*]").appName("PythonWordCount").config("spark.driver.host", "localhost").getOrCreate()

df = spark.createDataFrame([('数学', '张三', 88), ('语文', '张三', 92), ('英语', '张三', 77),
('数学', '王五', 65), ('语文', '王五', 87), ('英语', '王五', 90),
('数学', '李雷', 67), ('语文', '李雷', 33), ('英语', '李雷', 24),
('数学', '宫九', 77), ('语文', '宫九', 87), ('英语', '宫九', 90)
], ['subject', 'name', 'score'])

df.groupBy("subject").pivot("name").agg(F.sum("score").alias("sum")).show()

#另外的写法
df.groupBy("cat").pivot("name",["张三","王五"]).sum("score").show()
转换特定的行
#df.groupBy("subject").pivot("name",["张三","王五"]).agg(F.sum("score").alias("sum")).show()

concat_ws

用于连接,需要指定连接的字符串。一般配合collect_list或者collect_set使用。

df.createOrReplaceTempView("t1")

spark.sql("select subject,concat_ws('--->',collect_set(name)) from t1 group by subject").show()

lateral view

用于将列表字段展开,和explode一起使用。

df = spark.createDataFrame([('a', [1, 2, 3],['x','y']), ('b', [5, 2, 3],['x','y'])], ['id', 'c1','c2'])
df.show()
df.createOrReplaceTempView('t1')
spark.sql('select id,c1_1,c2_1 from t1 '
          'lateral view explode(c1) a as c1_1 '
          'lateral view explode(c2) b as c2_1 '
          ).show()
#另外一种方式,但只允许有一个explode语句

spark.sql('select id, explode(c1) a from t1').show()
原文地址:https://www.cnblogs.com/muyue123/p/13067049.html