设x是定义为(在Scala中)
的两列字符串的数据帧var child = spawn("sh",
["path_to_file_name", "args"],
{cwd:"/some/path/temp"}
);
我想清理这个数据框,使第二列的每个值都是
我在考虑使用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,编译器拒绝它。请问,解决方案是什么?只要我可以清理我的数据帧,一个完全不同的方法就可以了。
答案 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")))