我是火花/ scala的新手。我最初的RDD是Records类型,记录的布局是:
a_key, b_key,c_key,f_name,l_name,address
现在我必须:
我已经尝试过这种方式:
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两次。首先,更新无效记录的计数器,然后再次删除无效记录。
是否有更好/有效的方法?
答案 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
}