如何使用 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

Spark-Scala 无法推断架构(将输入路径验证推迟到数据源中)

在 Spark-Scala 中将单个字符串列拆分为多列

以动态方式找到Spark-Scala中的百分位数