scala - 如何将正则表达式解析为整个 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)
解决方案
您不能将相同的方法应用于整个数据框。
相反,您可以稍微优化您的代码。
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 > 0
Which会limit
再算,会增加你的性能。
推荐阅读
- mysql - 如何在 mysql 8.0 中声明变量使用 DECLARE?
- python - Flask - 配置子域会导致“代码 400,消息错误请求版本”
- javascript - 使用 JavaScript 从 S3 显示 CSV
- php - 如何在 laravel 上为城市制作子域(几乎成功)?
- python - 使用 Dict 中的键和值创建列表
- amazon-s3 - 如何在 mocha 中测试 aws S3
- html - 存在我没有制造的痣
- java - 运行此程序时,我不断收到错误索引超出长度范围
- laravel - 用户通过 Google 帐户登录特定应用后如何获取后续请求的令牌
- java - AWS Fargate:无法在 tomcat 中部署战争文件