Масштабирование: создание списка из столбца в трубе

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

Id  Label Value 
1   Red   5
1   Blue  6
2   Red   7
2   Blue  8
3   Red   9
3   Blue  10

Мне нужно превратить это в это:

ID Red Blue
1  5   6
2  7   8
3  9   10

Я знаю, как это сделать, используя команду pivot, но я должен явно знать значения меток. Как я могу динамически считывать метки из столбца "label" в список, который затем я могу передать в команду pivot? Я попытался создать список с:

pipe.groupBy('id) {_.toList('label) }

, но я получаю несоответствие типов, говоря, что он нашел символ, но ожидает (cascading.tuple.Fields, cascading.tuple.Fields). Кроме того, при чтении в Интернете кажется, что использование toList вызывает недовольство. Количество вещей в 'label' конечно и не так велико (может быть, 30-50 пунктов), но может отличаться в зависимости от того, с какой выборкой данных я работаю.

Любые ваши предложения будут великолепны. Спасибо большое!

2 ответа

Я думаю, что вы на правильном пути, вам просто нужно сопоставить нужные значения с символами:

val newHeaders = lines
    .map(_.split(" "))
    .map(a=>a(1))
    .distinct
    .map(f=>Symbol(f))
    .toList

Execution Тип поможет вам совместить с последующим пивотом, из соображений производительности.

Обратите внимание, что я использую TypedPipe для lines переменная.

Если вы хотите, чтобы ваш код был очень лаконичным, вы можете объединить строки 1 и 2, но это просто стилистический выбор:

map(_.split(" ")(1))

Попробуйте использовать Execution получить список значений из данных. Дополнительная информация о казнях: https://github.com/twitter/scalding/wiki/Calling-Scalding-from-inside-your-application

Другие вопросы по тегам