根据列数据类型过滤spark数据帧

时间:2018-04-23 10:29:15

标签: apache-spark dataframe

我有一个带有col_a和col_b的数据框,两者都在我收到的镶木地板文件中写成“String”。 col_b可以是int或字符串,我想过滤掉col_b不是int的所有行。

Input:
col_A   col_b
1       "abc"
2       "3"
3       "xyz"

Output:
col_a   col_b
2       3

我知道我需要进行类型转换,但不确定如何继续进行转换

2 个答案:

答案 0 :(得分:2)

这里确实不需要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| //+-----+-----+ ,然后过滤非空行。

<testData>
<datatype>
    <datatypename>datatypename1</datatypename>
    <datatype>datatype1</datatype>
</datatype>
<datavalue>
    <code>code1</code>
    <value>value1</value>
</datavalue>
<datavalue>
    <code>code2</code>
    <value>value2</value>
</datavalue>
<datavalue>
    <code>code3</code>
    <value>value3</value>
</datavalue>
</testData>

答案 1 :(得分:0)

您可以对数据框使用filter操作来过滤非Integer值。创建一个接受列值的UDF,如果值可以转换为true,则返回Int,否则返回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    | 
//    +-----+-----+