Spark Scala ETL:如何筛选按空格分割后长度为4的DataFrame行?
解决Spark Scala中筛选分割后数组长度为4的DataFrame行问题
嗨,我来帮你搞定这个问题!你踩的坑其实挺常见——Spark的Column对象和普通Scala集合(比如Array)不一样,不能直接调用原生的.length方法,得用Spark SQL专门提供的内置函数来处理数组类型的列。
正确的解决方案
Spark SQL提供了size()函数,专门用来获取数组类型列的元素个数,这正是你需要的工具。
方法1:使用size()函数(推荐)
先导入对应的函数,然后在where条件里用它判断分割后的数组长度:
import org.apache.spark.sql.functions.size // 筛选item列按空白符分割后有4个元素的行 df.where(size(split(df("item"), "\\s+")) == 4).show()
方法2:SQL表达式风格写法
如果你更习惯SQL语法,也可以用expr()函数直接写SQL式的条件:
import org.apache.spark.sql.functions.expr df.where(expr("size(split(item, '\\\\s+')) = 4")).show()
这里注意转义字符的处理:Scala字符串里要表示SQL中的\s+,需要写成\\\\s+。
额外优化建议
如果你的item列可能存在null或者空字符串,建议先过滤掉这些情况,避免split后得到空数组干扰结果:
import org.apache.spark.sql.functions.size df.filter(df("item").isNotNull && df("item") =!= "") .where(size(split(df("item"), "\\s+")) == 4) .show()
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

