неправильное начало объявления ошибки с foreach - PullRequest
0 голосов
/ 02 октября 2019

Я хочу показать различное количество столбцов1 для каждого порога счета;тем не менее, я получаю сообщение об ошибке «незаконное начало объявления» для этой строки:

results = results :+ (threshold,count)

Я пытаюсь выполнить z.show () на графике в блокноте Zeppelin.

У меня есть следующий код scala:

val score_threshold = Seq(50.0,100.0,200.0,250.00,500.00,1000.00) 
var results = Seq((0.0,0.0)) 

    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)
        })
z.show(results.toDF("threshold","count")) 

Это ошибка, которую я получаю:

error: illegal start of declaration
        results = results :+ (threshold,count)

Ответы [ 2 ]

1 голос
/ 02 октября 2019

Прежде всего, возможно, что 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)
}
0 голосов
/ 02 октября 2019
I was able to resolve the issue, but your solution is faster. 

val score_threshold = Seq(50.0,100.0,200.0,250.00,500.00,1000.00) 
var results = Seq[(Double,Double)]() 

score_threshold.foreach(threshold => { 
val count = Df.filter($"score" >= threshold).groupBy().agg(countDistinct("column1").as("count").cast(DoubleType)).rdd.map(x=> x.getDouble(0)).collect.head 

results = results :+ (threshold,count) }) 
z.show(results.toDF("score_threshold","count"))
...