行列变换的相关
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()