【问题标题】:How to Iterate each column in a Dataframe in Spark Scala如何在 Spark Scala 中迭代 Dataframe 中的每一列
【发布时间】:2017-11-27 13:03:41
【问题描述】:

假设我有一个包含多列的数据框,我想迭代每一列,进行一些计算并更新该列。有什么好办法吗?

【问题讨论】:

    标签: scala apache-spark dataframe bigdata


    【解决方案1】:

    @rogue-one 已经回答了您的问题,您只需修改答案以满足您的要求。

    以下是不使用Window函数的解决方案。

    val df = List(
      (2, 28),
      (1, 21),
      (7, 42)
    ).toDF("col1", "col2")
    

    你的输入 dataframe 应该是这样的

    +----+----+
    |col1|col2|
    +----+----+
    |2   |28  |
    |1   |21  |
    |7   |42  |
    +----+----+
    

    现在申请columnValue/sumOfColumnValues做为

    val columnsModify = df.columns.map(col).map(colName => {
      val total = df.select(sum(colName)).first().get(0)
      colName/total as(s"${colName}")
    })
    
    df.select(columnsModify: _*).show(false)
    

    你应该得到输出

    +----+-------------------+
    |col1|col2               |
    +----+-------------------+
    |0.2 |0.3076923076923077 |
    |0.1 |0.23076923076923078|
    |0.7 |0.46153846153846156|
    +----+-------------------+
    

    【讨论】:

    • 嗨 Ramesh,你能解释一下这里的 .map(col) 是什么吗?谢谢!
    • .map(col) 正在创建列对象。如果不定义列对象,函数调用将不起作用。
    【解决方案2】:

    更新 在下面的示例中,我有一个包含两个整数列 c1 和 c2 的数据框。每列的值除以其列的总和。

    import org.apache.spark.sql.expressions.Window
    val df = Seq((1,15), (2,20), (3,30)).toDF("c1","c2")
    val result = df.columns.foldLeft(df)((acc, colname) => acc.withColumn(colname, sum(acc(colname)).over(Window.orderBy(lit(1)))/acc(colname)))
    

    输出

    scala> result.show()
    +---+------------------+
    | c1|                c2|
    +---+------------------+
    |6.0| 4.333333333333333|
    |3.0|              3.25|
    |2.0|2.1666666666666665|
    +---+------------------+
    

    【讨论】:

    • 如果我有一个包含 1000 列的 df,我无法手写所有匹配函数。这种情况有没有更好的方法?谢谢!
    • 取决于您对每列的操作。如果您必须对所有列执行相同的操作,那么它很简单。如果您必须为每一列做一些独特的事情,那么您将不得不处理每一列。
    • 我需要做的是计算每列的总和,并将列中的每个数据点替换为(原始数字/总和)。基本上说每一列都是一样的。
    猜你喜欢
    • 1970-01-01
    • 2020-08-03
    • 1970-01-01
    • 2020-06-03
    • 1970-01-01
    • 2018-06-20
    • 1970-01-01
    • 2021-11-25
    • 2019-02-23
    相关资源
    最近更新 更多