Подтвердить что ты не робот

Замена нулевых значений на 0 после того, как световая рамка с левым внешним соединением

У меня есть два фрейма данных, называемых слева и справа.

scala> left.printSchema
root
|-- user_uid: double (nullable = true)
|-- labelVal: double (nullable = true)
|-- probability_score: double (nullable = true)

scala> right.printSchema
root
|-- user_uid: double (nullable = false)
|-- real_labelVal: double (nullable = false)

Затем я присоединяюсь к ним, чтобы получить объединенный Dataframe. Это левое внешнее соединение. Любой, кто интересуется функцией natjoin, может найти ее здесь.

https://gist.github.com/anonymous/f02bd79528ac75f57ae8

scala> val joinedData = natjoin(predictionDataFrame, labeledObservedDataFrame, "left_outer")

scala> joinedData.printSchema
|-- user_uid: double (nullable = true)
|-- labelVal: double (nullable = true)
|-- probability_score: double (nullable = true)
|-- real_labelVal: double (nullable = false)

Поскольку это левое внешнее объединение, столбец real_labelVal имеет значения null, когда user_uid отсутствует справа.

scala> val realLabelVal = joinedData.select("real_labelval").distinct.collect
realLabelVal: Array[org.apache.spark.sql.Row] = Array([0.0], [null])

Я хочу заменить нулевые значения в столбце realLabelVal на 1.0.

В настоящее время я делаю следующее:

  • Я нахожу индекс столбца real_labelval и использую API-интерфейс spark.sql.Row для установки нулей в 1.0. (Это дает мне RDD [Row])
  • Затем я применяю схему объединенного фрейма данных для получения очищенного фрейма данных.

Код выглядит следующим образом:

 val real_labelval_index = 3
 def replaceNull(row: Row) = {
    val rowArray = row.toSeq.toArray
     rowArray(real_labelval_index) = 1.0
     Row.fromSeq(rowArray)
 }

 val cleanRowRDD = joinedData.map(row => if (row.isNullAt(real_labelval_index)) replaceNull(row) else row)
 val cleanJoined = sqlContext.createDataFrame(cleanRowRdd, joinedData.schema)

Есть ли элегантный или эффективный способ сделать это?

Гулирование не помогло. Спасибо заранее.

4b9b3361

Ответ 1

Пробовали ли вы использовать na

joinedData.na.fill(1.0, Seq("real_labelval"))