在 spark 数据帧左外连接后用 0 替换空值
Replacing null values with 0 after spark dataframe left outer join
我有两个名为 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函数感兴趣的可以在这里找到。
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 列中的空值。
目前我在做以下事情:
- 我找到 real_labelval 列的索引并使用 spark.sql.Row API 将空值设置为 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)
有没有一种优雅或有效的方法来做到这一点?
古尔金并没有多大帮助。
提前致谢。
您尝试过使用na
joinedData.na.fill(1.0, Seq("real_labelval"))
我有两个名为 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函数感兴趣的可以在这里找到。
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 列中的空值。
目前我在做以下事情:
- 我找到 real_labelval 列的索引并使用 spark.sql.Row API 将空值设置为 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)
有没有一种优雅或有效的方法来做到这一点?
古尔金并没有多大帮助。 提前致谢。
您尝试过使用na
joinedData.na.fill(1.0, Seq("real_labelval"))