Прежде всего, возможно, что val counts
должно быть val count
?
Когда вы используете ()
в вызове foreach, вы можете передать в качестве аргумента только простое выражение. Чтобы сделать ваш аргумент простым выражением, вы должны обернуть порог: Удвойте также в ()
.
score_threshold.foreach( (threshold: Double) => {
val counts = DF.filter($"score" >= threshold)
.groupBy().agg(countDistinct("column1").as("count")).rdd.map(x=> x.getDouble(0)).collect.head
results = results :+ (threshold,count)
}
Если я могу порекомендовать (imho) лучший вариант. Когда вы знаете, что функция, которую вы хотите передать, не является простым выражением, вы должны использовать {}
после foreach
.
score_threshold.foreach { threshold: Double =>
val counts = DF.filter($"score" >= threshold) .groupBy().agg(countDistinct("column1").as("count")).rdd.map(x=> x.getDouble(0)).collect.head
results = results :+ (threshold,count)
}
Просто чтобы раздражать (и без какого-либо знания apache-zeppelin) Iдобавьте более функциональную альтернативу с foldLeft
вместо использования var
.
score_threshold.foldLeft(Seq((0.0,0.0))) {
case (acc, next) =>
val count = DF.filter($"score" >= next) .groupBy().agg(countDistinct("column1").as("count")).rdd.map(x=> x.getDouble(0)).collect.head
acc :+ (next,count)
}