我有一个DataFrame
用于SQL中的表。如果某个列的值是否为数字,我想过滤此DataFrame
。
val df = sqlContext.sql("select * from myTable");
val filter = df.filter("ISNUMERIC('col_a')");
//I want filter to be a dataframe of df where the values in col_a are numeric.
我当前的解决方案不起作用。我该如何实现?
答案 0 :(得分:1)
您可以filter
作为
df.filter(row => row.getAs[String]("col_a").matches("""\d+"""))
希望这会有所帮助!
答案 1 :(得分:0)
Shankar Koirala's answer有效地覆盖了整数。下面的正则表达式将涵盖需要双精度的用例,并带有可选的负号和对null的处理(请注意,这是Java的变体):
df.filter( df.col("col_a").isNotNull() )
.filter( ( FilterFunction<Row> )
row -> row.getString( row.fieldIndex( "col_a" ) ).matches( "-?\\d+\\.?\\d*" ) )
答案 2 :(得分:0)
您可以将相关字段强制转换为DECIMAL
并检查结果:
filter("CAST(col_a AS DECIMAL) IS NOT NULL")
(可选)您可以传递长度和/或精度以将有效数字缩小到特定的最大长度:
filter("CAST(col_a AS DECIMAL(18,8)) IS NOT NULL")
答案 3 :(得分:0)
答案 4 :(得分:0)
spark.sql("select phone_number, (CASE WHEN LENGTH(REGEXP_REPLACE(phone_number),'[^0-9]', '')) = LENGTH(TRIM(phone_number)) THEN true ELSE false END) as phone_number_isNumeric from table").show()
这确实是一个古老的帖子,但是如果有人正在寻找替代解决方案,仍然可以。
REGEXP_REPLACE(phone_number),'[^0-9]', ''
删除所有字符,除了数字