在spark数据帧离开外连接后用null替换空值

时间:2015-08-04 01:04:09

标签: scala join apache-spark spark-dataframe

我有两个名为 left right 的数据框。

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)

由于它是左外连接,当user_uid不在右边时,real_labelVal列具有空值。

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

我想用1.0替换realLabelVal列中的空值。

目前我执行以下操作:

  1. 我找到了real_labelval列的索引,并使用spark.sql.Row API将空值设置为1.0。 (这给了我一个RDD [Row])
  2. 然后,我应用已连接数据框架的模式来获取已清理的数据框。
  3. 代码如下:

     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)
    

    有优雅或有效的方法吗?

    Goolging并没有多大帮助。 提前谢谢。

1 个答案:

答案 0 :(得分:25)

您是否尝试过使用na

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