Нужна помощь в доступе к каждой строке столбца Int с использованием scala - PullRequest
1 голос
/ 28 мая 2019

Я пытаюсь получить доступ к каждой строке определенного "числа" столбца 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

1 Ответ

0 голосов
/ 31 мая 2019

Вот ответ для сравнения двух строк (так как у меня нет настройки Spark, я использую общие функции Scala).

Если l является IterableLike, например, Seq или List у вас есть функция 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

В вашем случае x и y, возможно, более сложный тип.

...