【问题标题】:how to access the column index for spark dataframe in scala for calculation如何在scala中访问spark数据框的列索引以进行计算
【发布时间】:2018-05-10 00:41:07
【问题描述】:

我是 Scala 编程的新手,我在 R 方面工作得非常广泛,但是在为 scala 工作时,很难在循环中提取特定列以对列值执行计算

让我用一个例子来解释一下:

我在加入 2 个数据帧后到达了最终数据帧, 现在我需要像一样进行计算

上面是参考列的计算,所以计算后我们会得到下面的火花数据帧

如何在for循环中引用列索引来计算scala中spark数据帧中的新列值

【问题讨论】:

    标签: scala spark-dataframe


    【解决方案1】:

    这是一种解决方案:

    Input Data:
    +---+---+---+---+---+---+---+---+---+
    |a1 |b1 |c1 |d1 |e1 |a2 |b2 |c2 |d2 |
    +---+---+---+---+---+---+---+---+---+
    |24 |74 |74 |21 |66 |65 |100|27 |19 |
    +---+---+---+---+---+---+---+---+---+
    

    压缩列以删除不匹配的列:

    val oneCols = data.schema.filter(_.name.contains("1")).map(x => x.name).sorted
    val twoCols = data.schema.filter(_.name.contains("2")).map(x => x.name).sorted
    val cols = oneCols.zip(twoCols) 
    
    //cols: Seq[(String, String)] = List((a1,a2), (b1,b2), (c1,c2), (d1,d2))
    

    使用 foldLeft 函数动态添加列:

    import org.apache.spark.sql.functions._
    val result = cols.foldLeft(data)((data,c) => data.withColumn(s"Diff_${c._1}",
                                                      (col(s"${lit(c._2)}") - col(s"${lit(c._1)}"))/col(s"${lit(c._2)}")))
    

    结果如下:

    result.show(false)  
    
    +---+---+---+---+---+---+---+---+---+------------------+-------+-------------------+--------------------+
    |a1 |b1 |c1 |d1 |e1 |a2 |b2 |c2 |d2 |Diff_a1           |Diff_b1|Diff_c1            |Diff_d1             |
    +---+---+---+---+---+---+---+---+---+------------------+-------+-------------------+--------------------+
    |24 |74 |74 |21 |66 |65 |100|27 |19 |0.6307692307692307|0.26   |-1.7407407407407407|-0.10526315789473684|
    +---+---+---+---+---+---+---+---+---+------------------+-------+-------------------+--------------------+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-03
      • 2020-08-03
      • 1970-01-01
      • 1970-01-01
      • 2019-04-21
      • 2020-06-13
      • 2020-12-27
      • 2016-05-22
      相关资源
      最近更新 更多