如何使用Spark Java API 2.2过滤出account列为数字的数据集?
解决Spark Java API过滤数字account行的问题
嗨,我来帮你搞定这个问题!首先得说清楚你之前的代码为什么没生效:你的account列是字符串类型,而isNaN()方法是用来判断数值类型(比如Double、Float)的值是否为非数字(比如计算产生的NaN),对字符串完全不起作用,所以过滤没有效果。
下面给你两种可行的解决方案,你可以根据需求选择:
方法1:使用正则表达式匹配纯数字字符串
利用Spark的rlike方法,通过正则表达式匹配整个account字符串都是数字的行:
// 匹配纯整数的字符串,比如"123333" Dataset<Row> ds2 = ds1.filter(ds1.col("account").rlike("^\\d+$"));
如果你的场景中需要保留带小数点的数字(比如"123.45"),可以把正则改成^\\d+(\\.\\d+)?$,这样就能匹配整数和小数形式的数字字符串了。
方法2:通过类型转换判断有效性
尝试将account列转换为数值类型,转换成功的就是合法数字行,转换失败的会变成null,我们只需要过滤掉null的行即可:
// 转换为Long类型,适合整数场景 Dataset<Row> ds2 = ds1.filter(ds1.col("account").cast(DataTypes.LongType).isNotNull()); // 如果需要支持小数,可以转换为Double类型 // Dataset<Row> ds2 = ds1.filter(ds1.col("account").cast(DataTypes.DoubleType).isNotNull());
这种方法的好处是不需要写正则,而且能自动处理一些可能的格式问题(比如字符串前后有空格的话,转换前可以先加个trim():ds1.col("account").trim().cast(...))。
两种方法各有优劣:正则更灵活,可以精确控制匹配规则;类型转换更直观,适合单纯判断是否能转为数字的场景,你可以根据自己的实际需求选择~
内容的提问来源于stack exchange,提问作者HamSoft
相关产品推荐
相关产品推荐

