Масштабирование: создание списка из столбца в трубе
Мне нужно взять канал, у которого есть столбец меток со связанными значениями, и повернуть этот канал так, чтобы для каждой метки был столбец с правильными значениями в каждом столбце. Вот пример, если у меня есть это:
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