Как заменить NULL на 0 в левом внешнем соединении в кадре данных SPARK v1.6

Я работаю Spark v1.6. У меня есть следующие два кадра данных, и я хочу преобразовать нуль в 0 в моем левом внешнем соединении ResultSet. Какие-либо предложения?

кадры данных

val x: Array[Int] = Array(1,2,3)
val df_sample_x = sc.parallelize(x).toDF("x")

val y: Array[Int] = Array(3,4,5)
val df_sample_y = sc.parallelize(y).toDF("y")

Левое внешнее соединение

val df_sample_join = df_sample_x
  .join(df_sample_y,df_sample_x("x") === df_sample_y("y"),"left_outer")

Набор результатов

scala> df_sample_join.show

x  |  y
--------
1  |  null

2  |  null

3  |  3

But I want the resultset to be displayed as.
-----------------------------------------------

scala> df_sample_join.show

x  |  y
--------
1  |  0

2  |  0

3  |  3

person Prasan    schedule 23.11.2016    source источник


Ответы (3)


Просто используйте na.fill:

df.na.fill(0, Seq("y"))
person Community    schedule 23.11.2016

Пытаться:

val withReplacedNull = df_sample_join.withColumn("y", coalesce('y, lit(0)))

Протестировано на:

import org.apache.spark.sql.Row
import org.apache.spark.sql.functions.{col, udf}
import org.apache.spark.sql.types._

val list = List(Row("a", null), Row("b", null), Row("c", 1));
val rdd = sc.parallelize(list);

val schema = StructType(
    StructField("text", StringType, false) ::
    StructField("y", IntegerType, false) :: Nil)

val df = sqlContext.createDataFrame(rdd, schema)
val df1 = df.withColumn("y", coalesce('y, lit(0)));
df1.show()
person T. Gawęda    schedule 23.11.2016
comment
Спасибо. это сработало :) val df_sample_join = df_sample_x.join(df_sample_y,df_sample_x(x) === df_sample_y(y),left_outer).select(df_sample_x(x),coalesce('y, lit(0))) - person Prasan; 23.11.2016

Вы можете исправить существующий фрейм данных следующим образом:

import org.apache.spark.sql.functions.{when,lit}
val correctedDf=df_sample_join.withColumn("y", when($"y".isNull,lit(0)).otherwise($"y"))

Хотя ответ Т. Гавенды также работает, я думаю, что это более читабельно

person Raphael Roth    schedule 23.11.2016
comment
На мой взгляд, объединение более читабельно - это зависит от вас;) Но ваш ответ также правильный, поэтому проголосуйте с моей стороны. - person T. Gawęda; 23.11.2016