У меня есть эта функция:
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)]
).
У кого-нибудь есть идеи или предложения? Заранее спасибо
Ps Я не знаю, является ли использование аккумулятора более эффективным, чем подсчет, но я просто хотел бы попробовать.
Редактировать: Должен ли я вместо этого использовать 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}}))
У кого-нибудь есть идеи или предложения?