在Spark DataFrames中将无效数据设置为缺少数据

时间:2015-11-18 14:30:25

标签: scala apache-spark dataframe user-defined-functions missing-data

设x是定义为(在Scala中)

的两列字符串的数据帧
var child = spawn("sh",
   ["path_to_file_name", "args"],
   {cwd:"/some/path/temp"}
);

我想清理这个数据框,使第二列的每个值都是

  1. 如果可能的话,转入Int
  2. 替换为null,Na或任何符号含义"缺失值" (不是NaN,这是不同的)
  3. 我在考虑使用udf函数

    case class Pair(X: String, Y: String)
    
    val x = sqlContext.createDataFrame(Seq(
       Pair("u1", "1"), 
       Pair("u2", "wrong value"), 
       Pair("u3", "5"), 
       Pair("u4", "2")
    ))
    

    ...但null不是String,编译器拒绝它。请问,解决方案是什么?只要我可以清理我的数据帧,一个完全不同的方法就可以了。

2 个答案:

答案 0 :(得分:4)

实际上在这种特殊情况下,不需要UDF。相反,您可以安全地使用Column.cast方法:

import org.apache.spark.sql.types.IntegerType
val clean = x.withColumn("Y", $"Y".cast(IntegerType)) // or .cast("integer")

clean.where($"Y".isNotNull).show
// +---+---+
// |  X|  Y|
// +---+---+
// | u1|  1|
// | u3|  5|
// | u4|  2|
// +---+---+

clean.where($"Y".isNull).show
// +---+----+
// |  X|   Y|
// +---+----+
// | u2|null|
// +---+----+

答案 1 :(得分:2)

使用null

,而不是使用Option[Int]
val pairs = Seq(
   Pair("u1", "1"), 
   Pair("u2", "wrong value"), 
   Pair("u3", "5"), 
   Pair("u4", "2")
)

def toInt(s: String): Option[Int] = try { Some(s.toInt) } catch { case NumberFormatException => None }

val stringToInt = udf[Int, Option[Int]](toInt _)

然后你可以做

val x = sqlContext.createDataFrame(pairs)
x.withColumn("Y", stringToInt(x("Y")))