Spark Scala:如何同时过滤RDD和更新计数器

时间:2018-12-17 23:36:46

标签: scala apache-spark apache-spark-sql

我是火花/ scala的新手。我最初的RDD是Records类型,记录的布局是:

a_key, b_key,c_key,f_name,l_name,address

现在我必须:

  • 删除具有a_key或b_key或c_key为空/空的记录
  • 我必须同时为无效记录更新一个计数器。

我已经尝试过这种方式:

sc.register( recordStatsAccumulator, "Stat accumulator for " + filename )

val nullFilteredRecords = records.map{ record =>

  if( record.A_KEY.isEmpty ||
    record.B_KEY.isEmpty ||
    record.C_KEY.isEmpty )
  {
    recordStatsAccumulator.add( ValidationLoggingUtil.INVALID )
  }

  record

 }
 .filter( record =>
    !record.A_KEY.isEmpty &&
      !record.B_KEY.isEmpty &&
      !record.C_KEY.isEmpty
  )

但是,此代码效率不高,因为它贯穿整个RDD两次。首先,更新无效记录的计数器,然后再次删除无效记录。

是否有更好/有效的方法?

1 个答案:

答案 0 :(得分:0)

我认为您可以一步将两个操作合并在一起。像这样:

val nullFilteredRecords = records.filter { record =>
  if( record.A_KEY.isEmpty ||
    record.B_KEY.isEmpty ||
    record.C_KEY.isEmpty ) {
    recordStatsAccumulator.add( ValidationLoggingUtil.INVALID )
  }
  !record.A_KEY.isEmpty && !record.B_KEY.isEmpty && !record.C_KEY.isEmpty
}