Scala/Scalding: сводные данные

У меня есть набор данных, который является результатом ошпаривания трубы, который выглядит так:

'Var1, 'Var2, 'Var3, 'Var4 =
 a,x,1,2
 a,y,3,4
 b,x,1,2
 b,y,3,4

Я пытаюсь превратить это во что-то вроде:

'Var1, 'Var3x, 'Var4x, 'Var3y, 'Var4y =
a,1,2,3,4
b,1,2,3,4

Сначала я думал, что использование flatMap как-то сработает, но это не казалось правильным. Похоже, какое-то использование функции поворота должно работать, но я не могу понять, как повернуть несколько столбцов.

Любая помощь приветствуется.


person J Calbreath    schedule 22.11.2014    source источник


Ответы (1)


Вам нужно объединить два столбца значений в один, а затем вы можете использовать .pivot. Что-то вроде этого:

case class v34(v3: Int, v4: Int) 
pipe
    .map(('Var3, 'Var4) -> ('V34)) { vars: (Int, Int) => v34(vars._1, vars._2) }
    .groupBy('Var1) { _.pivot(('Var2, 'V34) => ('x, 'y)) }
    .mapTo(('Var1, 'x, 'y) -> ('Var1, 'Var3x, 'Var4x, 'Var3y, 'Var4y) { 
       vars: (String,V34,V34) =>
       val (key, xval, yval) = vars
       (key, xval.v3, xval.v4, yval.v3, yval.v4)
    }

    .
person Dima    schedule 22.11.2014
comment
Я прошел через комбинацию и разворот в порядке, но не могу распаковать его должным образом. Пара вопросов по карте. 1) в строке vars: следует читать v34, v34 вместо V34,V34? Это относится к имени класса case, верно? 2) Я получаю сообщение об ошибке в строке val, в котором говорится, что не удается найти значение Val. На что именно ссылаются Кабал и Увеал? Большое спасибо за вашу помощь. - person J Calbreath; 24.11.2014
comment
Извините, в вопросе 2 автокоррекция, кажется, меня достала. Ошибка говорит: «не удается найти значение xval». На что ссылаются xval и yval? - person J Calbreath; 24.11.2014
comment
1) Да, извините, должна была быть v34, конечно 2) Думаю, это просто побочный эффект #1: val (key, xval, yval) = vars просто объявляет три новые переменные, а vars распаковывает в них. Я думаю, он просто сбит с толку, потому что думает, что vars не определено из-за опечатки в имени типа. - person Dima; 24.11.2014
comment
Спасибо! Я понял свою ошибку. Я сделал этот пример универсальным, но когда я преобразовал его обратно в свое конкретное приложение, я написал эквивалент Xval вместо xval. Не уверен, почему заглавная буква в начале имеет значение (я новичок в Scala и Scalding), но после ее изменения все работает отлично. - person J Calbreath; 24.11.2014