обновить элемент массива в наборе данных на основе условия в искровом скале - PullRequest
0 голосов
/ 04 мая 2018

У меня есть набор данных в формате

scala> rxClaimsUpdated.take(1)
res0: Array[(String, Array[String])] = Array((186037020,Array(
    22960551, 
    hfeu0ysji96afjdicbmqbheop0zsbfuvs4ongjb6yqg=,
    095aa9d791b7b0b0f7f312435b8e30f1, 
    2016-10-15, 
    2015-02-13, 
    00186037020, 
    10, 
    30,  
    "",  
    20)))

для внутреннего массива я хочу обновить 9-й элемент (последний), если его значение равно 0. (в данном примере значение равно 20).

код, который я пробовал, который дает ошибку

val rxClaimsUpdatedtemp = rxClaimsUpdated.map(z => 
    if(z._2(9).toInt == 0) z._2.updated(9,1) 
    else z._2(9)
)

найди мою ошибку ниже

<console>:55: error: Unable to find encoder for type stored in a
Dataset.  Primitive types (Int, String, etc) and Product types 
(case classes) are supported by importing spark.implicits._  
Support for serializing other types will be added in future releases.

       val rxClaimsUpdatedtemp = rxClaimsUpdated.map(z => if(z._2(9).toInt == 0) z._2.updated(9,1) else z._2(9))
                                                    ^

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Шанкар Койрала правильно указал на ошибку, что вы пытаетесь обновить элемент массива [String] с помощью Int. другой подход к тому же решению:

val rxClaimsUpdatedtemp = rxClaimsUpdated.map { elem =>
    (
        elem._1, 
        elem._2.take(elem._2.length-1) ++ {if (elem._2.last == 0) Array("1") else Array()}}
    )
}

Здесь тип rxClaimsUpdatedtemp будет таким же, как и rsClaimsUpdated, так как здесь мы сохраняем первые элементы кортежа при обновлении вторых элементов.

Логика для обновления вторых элементов: возьмите n-1 элементов из массива размера n и добавьте пустой массив Array () или Array ("1") после проверки последнего элемента массива.

0 голосов
/ 04 мая 2018

Вы пытаетесь обновить Array[String] с помощью Integer, поэтому он выдает ошибку.

Вот что вы можете сделать

rxClaimsUpdatedtemp.map(z => {
  if (z._2(9).toInt == 0) { //check of zero 
    z._2.update(9, "1")
    z // update with above code and return the array
  }
  else z   //return default array
})

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...