如何使用 spark-scala 在 spark 数据帧上执行枢轴?
Posted
技术标签:
【中文标题】如何使用 spark-scala 在 spark 数据帧上执行枢轴?【英文标题】:How to perform pivot on spark dataframe using spark-scala? 【发布时间】:2021-08-05 05:55:35 【问题描述】:下面是输入数据框。
+----------+------------+
|sensortype|sensorstatus|
+----------+------------+
|Sensor1 |offline |
|Sensor1 |offline |
|Sensor1 |online |
|Sensor2 |offline |
|Sensor2 |offline |
|Sensor3 |online |
+----------+------------+
我想把上面的dataFrame改成如下图,
+----------+-------+------+-----+
|sensortype|offline|online|total|
+----------+-------+------+-----+
|Sensor2 |2 |0 |2 |
|Sensor3 |0 |1 |1 |
|Sensor1 |2 |1 |3 |
+----------+-------+------+-----+
【问题讨论】:
【参考方案1】:我们可以使用 spark-scala 的数据透视和聚合函数获得所需的结果。
val spark = SparkSession.builder().master("local[*]").getOrCreate()
import spark.implicits._
spark.sparkContext.setLogLevel("ERROR")
// Sample dataframe
val df = Seq(
("Sensor1", "offline"),
("Sensor1", "offline"),
("Sensor1", "online"),
("Sensor2", "offline"),
("Sensor2", "offline"),
("Sensor3", "online")
).toDF("sensortype", "sensorstatus")
df.groupBy("sensortype")
.pivot("sensorstatus").agg(count("sensorstatus"))
// Replace null by 0 in columns - offline and online
.na.fill(0, Seq("offline", "online"))
.withColumn("total", 'offline + 'online)
.show(false)
+----------+-------+------+-----+
|sensortype|offline|online|total|
+----------+-------+------+-----+
|Sensor2 |2 |0 |2 |
|Sensor3 |0 |1 |1 |
|Sensor1 |2 |1 |3 |
+----------+-------+------+-----+
【讨论】:
这一行出现错误 -> ".withColumn("total", 'offline + 'online)"以上是关于如何使用 spark-scala 在 spark 数据帧上执行枢轴?的主要内容,如果未能解决你的问题,请参考以下文章
我们如何在 Spark-Scala 和 Cataloging UDF 中注册一个函数以及其他函数?
Spark-Scala:另存为 csv 文件(RDD)[重复]
Spark-Scala:使用异常处理将固定宽度线解析为 Dataframe Api