如果列包含整数值,则如何返回布尔值,而不是使用 Spark 数据帧搜索数百万条记录


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 秒。

最新更新