【发布时间】:2020-03-20 10:49:06
【问题描述】:
我有这个功能:
def countNullValueColumn(df: DataFrame): Array[(String, Long)] =
df.columns
.map(x => (x, df.filter(df(x).isNull || df(x) === "" || df(x).isNan).count))
我正在尝试使用 val counter = sc.longAccumulator 代替数据帧计数函数,但没有成功。
我所做的尝试是:
df.columns.foreach(x => {df.filter(df(x).isNull || df(x) === "" || df(x).isNaN) {counter.add(1)} (x, counter.value)})
df.columns.foreach(x => {df.filter(df(x).isNull || df(x) === "" || df(x).isNaN) {counter.add(1); (x, counter.value)} })
不幸的是,这些都不起作用,因为它没有返回正确的类型 (Array[(String, Long)])。
有人有什么想法或建议吗? 提前致谢
附:我不知道使用累加器是否比计数更有效,但我想尝试一下。
编辑:我应该使用foreach 而不是map 来避免累加器中的值错误吗?因为map 是一个转换,而foreach 是一个动作
Edit2:根据@DNA 的建议,我将代码中的map 更改为foreach。
Edit3:好的,现在问题变成了尝试创建Array[(String, Long)]。我试过这个,但:+ 运算符不起作用。
val counter = session.sparkContext.longAccumulator
val res: Array[(String, Long)] = Array()
df.columns
.foreach(x => res :+ (x, df.filter{ df(x).isNull || df(x) === "" || df(x).isNaN {counter.add(1); counter.value}}))
有人有什么想法或建议吗?
【问题讨论】: