可以通过ISNUMERIC函数过滤Spark数据帧吗?

时间:2018-07-23 15:49:02

标签: scala apache-spark

我有一个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.

我当前的解决方案不起作用。我该如何实现?

5 个答案:

答案 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)

您还可以使用spark udf。

有关更多详细信息,请参考以下网址-

Need the equivalent of SQL IsNumeric function in spark sql

答案 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]', '' 

删除所有字符,除了数字