Почему появляется ошибка CombineByKey при использовании трехэлементных кортежей? - PullRequest
0 голосов
/ 07 марта 2019

Я пытаюсь работать над scala, чтобы вычислить статистику по моим данным.У меня есть массив кортежей

agency_time_map = Array(("LA", 2), ("NY", 4), ...)

Я пытаюсь использовать CombineByKey:

val combiner = (x: Double) => (1, x, x*x)

val merger = (x: (Int, Double, Double), y: (Double, Double)) => {
    val (c, acc_1, acc_2) = x
    val (y_1, y_2) = y
    (c+1, acc_1 + y_1, acc_2 + y_2)
}

val mergeAndCombiner = (x1: (Int, Double, Double), x2: (Int, Double, Double)) => {
    val (c1, acc1_1, acc1_2) = x1
    val (c2, acc2_1, acc2_2) = x2
    (c1+c2, acc1_1 + acc2_1, acc1_2 + acc2_2)
}

При использовании его с моими данными я получаю следующую ошибку:

agency_time_map.combineByKey(combiner,merger,mergeAndCombiner)

<console>:32: error: type mismatch;
 found   : ((Int, Double, Double), (Double, Double)) => (Int, Double, Double)
 required: (?, Double) => ?
       agency_time_map.combineByKey(combiner,merger,mergeAndCombiner)

Я пытался понять это по-нашему, но интерпретация ошибки довольно трудна.

Я подозреваю, что проблема связана с объединителем или методом слияния.

Не могли бы вы помочь?мне разобраться в проблеме?

Спасибо

1 Ответ

0 голосов
/ 07 марта 2019

Это потому, что подпись объединения по ключу, в контексте RDD[(K, V)] это

def combineByKey[C](createCombiner: (V) ⇒ C, mergeValue: (C, V) ⇒ C, mergeCombiners: (C, C) ⇒ C): RDD[(K, C)]

Это означает, что тип второго аргумента mergeValue - V

mergeValue: (C, V) ⇒ C

должен соответствовать второму типу аргумента и типу аргумента createCombiner.

Если createCombiner определяется как

val combiner = (x: Double) => (1, x, x*x)

, то есть (Double) => (Int, Double Double), тогда mergeValue должно быть:

(C, Double) => C

, где C равно (Int, Double Double) - тип возврата createCombiner.

Это очевидно не выполняется, если createCombiner равно (C, (Double, Double)) => C, как в вашем коде.

Давайте оставим фактическую реализацию в качестве упражнения для пользователя - так как вопрос выглядит далеко, чтобы быть домашним заданием.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...