【问题标题】:Column manipulations in Spark ScalaSpark Scala 中的列操作
【发布时间】:2021-08-14 04:43:02
【问题描述】:

我正在学习使用 Apache Spark (Scala),并且仍在弄清楚这里的工作方式

我正在努力实现一个简单的任务

  1. 查找列的最大值
  2. 从该最大值中减去该列的每个值并创建一个新列

我使用的代码是

import org.apache.spark.sql.functions._
val training = sqlContext.createDataFrame(Seq(
  (10),
  (13),
  (14),
  (21)
)).toDF("Values")

val training_max = training.withColumn("Val_Max",training.groupBy().agg(max("Values"))
val training_max_sub = training_max.withColumn("Subs",training_max.groupBy().agg(col("Val_Max")-col("Values) ))

但是我遇到了很多错误。我或多或少精通 R,如果我一直在做同样的任务,我的代码会是:

library(dplyr)
new_data <- training %>%
    mutate(Subs= max(Values) - Values)

【问题讨论】:

    标签: scala apache-spark apache-spark-sql


    【解决方案1】:

    这是一个使用窗口函数的解决方案。您需要HiveContext 才能使用它们

    import org.apache.spark.sql.hive.HiveContext
    import org.apache.spark.sql.functions._
    import org.apache.spark.sql.expressions.Window
    
    val sqlContext = new HiveContext(sc)
    import sqlContext.implicits._
    
    val training = sc.parallelize(Seq(10,13,14,21)).toDF("values")
    
    training.withColumn("subs", 
       max($"values").over(Window.partitionBy()) - $"values").show
    

    产生预期的输出:

    +------+----+
    |values|subs|
    +------+----+
    |    10|  11|
    |    13|   8|
    |    14|   7|
    |    21|   0|
    +------+----+
    

    【讨论】:

    • 感谢您的帮助。这是完美的
    猜你喜欢
    • 2020-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    • 2019-11-17
    相关资源
    最近更新 更多