我有一个带有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
我知道我需要进行类型转换,但不确定如何继续进行转换
答案 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 |
// +-----+-----+