var isIntContains = dataFrame.filter(col(colName).rlike("^\d+")).count()
if (isIntContains > 0) {
print("It contains integer value in column provided")
}
其中 colName 是动态传递的 coumn 名称。
在这里,它会迭代所有行直到最后一行,即使找到整数值也会继续。我想编写逻辑,以便如果列中至少有一个值是整数,它就会返回 true/false。
这实际上是一个很好的问题。事实上,没有必要扫描整个数据集,因为如果找到 1 个整数,您希望中断搜索。
在数据帧 API 中,您可以尝试:
var isIntContains:Boolean =
dataframe.filter(col(colname).rlike("^\d+")).take(1).size>0
但我发现使用 RDD API 甚至更快:
var isIntContains : Boolean = dataframe.rdd
.mapPartitions(rows => {
rows.find(row => row.getAs[String](colname).matches("^\d+")) match {
case Some(_) => Iterator(1)
case None => Iterator.empty
}
}).isEmpty
我已经使用随机生成的长度为 5 的字母数字尝试了上述方法(因此结果是整数的可能性很低(
val dataframe =
sparkContext.parallelize(
(1 to 1000000)
.map(_ => scala.util.Random.alphanumeric.take(5).mkString(""))
)
.toDF("i")
.repartition(10)
.cache
现在,如果我检查数据帧中的有效整数使用您的解决方案(即使用count
(,则需要 ~ 1.5 秒,而使用我的第一个解决方案(数据帧(只需要 0.7 秒,使用我的第二个解决方案(RDD( 只需要 0.6 秒。