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

86
9

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


DataFrames


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


val y: Массив [Int] = Массив (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" )


Resultset


scala > df_sample_join.show


x | у


1 | нуль


2 | нуль


3 | 3


Но я хочу, чтобы список результатов отображался как.


scala > df_sample_join.show


x | у


1 | 0


2 | 0


3 | 3

спросил(а) 2016-11-23T21:55:00+03:00 4 года, 3 месяца назад
1
Решение
117

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

df.na.fill(0, Seq("y"))

ответил(а) 2016-11-23T23:13:00+03:00 4 года, 3 месяца назад
85

Try:


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()

ответил(а) 2016-11-23T22:27:00+03:00 4 года, 3 месяца назад
61

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


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

Хотя ответ T. Gawęda также работает, я думаю, что это более читаемо

ответил(а) 2016-11-23T22:49:00+03:00 4 года, 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема