【问题标题】:Filter a spark dataframe based on column datatypes根据列数据类型过滤火花数据框
【发布时间】:2018-04-23 10:29:14
【问题描述】:
我有一个带有 col_a 和 col_b 的数据框,并且在我收到的镶木地板文件中都写为“字符串”。 col_b 可以是 int 或 string,我想过滤掉 col_b 不是 int 的所有行。
Input:
col_A col_b
1 "abc"
2 "3"
3 "xyz"
Output:
col_a col_b
2 3
我知道我需要进行类型转换,但不知道如何继续进行
【问题讨论】:
标签:
apache-spark
dataframe
【解决方案1】:
这里真的不需要UDF。您可以将cast 列为int 列,它会在失败的任何地方返回null,然后过滤非空行。
val df = Seq((1, "abc"),
(2, "3"),
(3, "xyz")).toDF("col_a", "col_b")
df.filter( $"col_b".cast("int").isNotNull ).show
//+-----+-----+
//|col_a|col_b|
//+-----+-----+
//| 2| 3|
//+-----+-----+
【解决方案2】:
您可以在数据帧上使用filter 操作来过滤非整数值。创建一个接受列值的 UDF,如果该值可以转换为 Int,则返回 true,否则返回 false。
//your original DF
val df = Seq((1, "abc"),
(2, "3"),
(3, "xyz")).toDF("col_a", "col_b")
//create a udf for filter function
val isValueInt = udf((value: String) => Try(value.toInt).isSuccess)
//apply the filter on DF
df.filter(isValueInt($"col_b")).show(false)
// output
// +-----+-----+
// |col_a|col_b|
// +-----+-----+
// |1 |3 |
// +-----+-----+