【问题标题】:Need help in accessing each row of an Int column using scala在使用 scala 访问 Int 列的每一行时需要帮助
【发布时间】:2019-05-28 07:52:24
【问题描述】:

我正在尝试访问特定 Int 列“数字”的每一行,以跟踪数字列中的上一行和下一行。作为新手,尝试了以下几个示例,但我无法解决它。我在网上查了多个来源,但无法纠正。我确实认为列表/集合可能有效,但我不知道如何实现它。有人可以帮助我吗?

我尝试了以下方法,但出现“Int 不接受参数”错误

    import org.apache.spark.sql.functions._
    import org.apache.spark.sql.expressions.Window
    import org.apache.spark.broadcast.Broadcast
    import org.apache.spark.rdd.RDD
    import org.apache.spark.sql.Row

    val df = df_new.select($"tin", $"year",$"mnth",
   struct($"date_begin", $"date_end",$"start",$"end",$"usage",$"numbers")
    as "data").rdd.groupBy(x => (x.getString(0),x.getInt(1),x.getInt(2)))
    .map( x => {

        val tin = x(0).getString(0)
        val year = x(0).getInt(1)
        val month = x(0).getInt(2)
        val use = x(0).getStruct(3).getFloat(4)
        var sum:Float = 0.0F
        val nums = x(0).getStruct(3).getInt(5)


        for (i <- x.indices)
                 {
                      val v = x(i).getStruct(3)
                      val n = x(i).getStruct(3).getInt(5)
                      var next = n(i+1)
                      var prev = n(i-1)

                      if(nums == next || nums == prev)
                      {
                         sum  =  sum + v.getFloat(4)
                      }
                      else
                      {
                          sum 
                      }
                      }
                      (tin,year,nums)
                }
            )

我需要获取如下数据

 numbers            next             prev
   0                  1              null
   1                  0              0
   0                  1              1
   1                  1              0
   1                  0              1
   0                  1              1
   1                  1              0
   1                  1              1
   1                  1              1
   1                  0              1
   0                null             1

【问题讨论】:

  • 在哪一栏?
  • @pme 嗨,在结构内的“数字”列上,在描述中也指定了相同的内容
  • @pme 嗨,您能否提出任何可能的方法来实现这一点,提前谢谢您。
  • 是这条线:val nums = x(0).getStruct(3).getInt(5) 给出了错误(对不起,我没有安装 apache spark 的项目)
  • @pme 我主要需要知道如何遍历 scala 中的特定列,这里的列是“数字”,就像我需要将当前值与上一个值和当前值与下一个值进行比较一个特定的列,例如 x(i+1) 和 x(i-1)

标签: scala apache-spark rdd


【解决方案1】:

这是比较两行的答案(因为我没有 Spark 设置,所以我使用通用 Scala 功能)。

如果lIterableLike,例如SeqList你有一个函数sliding

所以这里是一个例子:

val l = Seq(1,2,3,4,5)

l.sliding(2) // gives you Seq(List(1,2),List(2,1)..)
 .map{case x::y::_ => //here you can compare these two values

在您的情况下,xy 可能是更复杂的类型。

【讨论】:

  • 是的,我也试过了,正如你所说的有点复杂,或者我让它看起来很复杂,或者在我的情况下这可能是不可能的我不确定,非常感谢你的时间!
  • 尽量简化您的问题。引入中间值并添加类型——这样就更清楚了
猜你喜欢
  • 2019-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-21
  • 2017-01-09
相关资源
最近更新 更多