首页 > 解决方案 > 如何将正则表达式解析为整个 spark 数据框而不是每一列?

问题描述

我想检查 csv 文件中是否有任何公式列。所以我构建了一个正则表达式并想要解析整个数据框。

我有一个解决方案,但它是逐列进行的,我觉得它会影响大型数据集的性能。

 val columns = df.columns
 import spark.implicits._
 val dfColumns = columns.map{name =>
  val some = df.filter($"$name".rlike("""^=.+\)$"""))
  some.count()>0
 }
 val exist = dfColumns.exists(x=> x)

标签: scalaapache-spark

解决方案


您不能将相同的方法应用于整个数据框。

相反,您可以稍微优化您的代码。

val df = spark.read.csv("your_path").cache // Cache the dataframe to avoid re reading
import spark.implicits._

df.columns.map{
  name => df.filter($s"$name".rlike("""^=.+\)$""")).isEmpty // Use isEmpty to avoid counting everything when it is not needed.
}.exists(identity)

请注意,过滤器通常被推到催化剂计划的顶部,所以如果你做的不仅仅是阅读,cache可能不会带来更好的性能(但isEmpty总是会这样做)

PS:isEmpty是从Spark 2.3开始的,如果你没有合适的版本,可以先用df.limit(1).count > 0Which会limit再算,会增加你的性能。


推荐阅读