У меня есть DataFrame, который выглядит следующим образом:перегруппировка/конкатенации DataFrame строки в Спарк
scala> data.show
+-----+---+---------+
|label| id| features|
+-----+---+---------+
| 1.0| 1|[1.0,2.0]|
| 0.0| 2|[5.0,6.0]|
| 1.0| 1|[3.0,4.0]|
| 0.0| 2|[7.0,8.0]|
+-----+---+---------+
Я хочу, чтобы перегруппировать функции на основе «ид», так что я могу получить следующее:
scala> data.show
+---------+---+-----------------+
| label| id| features |
+---------+---+-----------------+
| 1.0,1.0| 1|[1.0,2.0,3.0,4.0]|
| 0.0,0.0| 2|[5.0,6.0,7.8,8.0]|
+---------+---+-----------------+
Это код, я использую для создания упомянутого DataFrame
val rdd = sc.parallelize(List((1.0, 1, Vectors.dense(1.0, 2.0)), (0.0, 2, Vectors.dense(5.0, 6.0)), (1.0, 1, Vectors.dense(3.0, 4.0)), (0.0, 2, Vectors.dense(7.0, 8.0))))
val data = rdd.toDF("label", "id", "features")
Я пытался разные вещи с б od RDD и DataFrames. Самый «перспективный» подход до сих пор был в фильтре на основе «ID»
data.filter($"id".equalTo(1))
+-----+---+---------+
|label| id| features|
+-----+---+---------+
| 1.0| 1|[1.0,2.0]|
| 1.0| 1|[3.0,4.0]|
+-----+---+---------+
Но у меня есть два узких места сейчас:
1) Как автоматизировать фильтрацию для всех различных значений, что «идентификатор» мог бы иметь?
Ниже генерирует ошибку:
data.select("id").distinct.foreach(x => data.filter($"id".equalTo(x)))
2) Как конкатенации общего "особенность" по отношению к данному "ID". Не пробовал много, так как я все еще застряли на 1)
Любое предложение более чем приветствуется
Примечание: Для осветления «ярлык» всегда одинакова для каждого вхождения «ID». Извините за путаницу, простое расширение моей задачи будет также группировать «метки» (обновленный пример)
Спасибо @ zero323! Я могу подтвердить, что ваш код выполняет желаемую задачу. Я все еще пытаюсь понять детали всех шагов. Кстати, у меня возникла ошибка при запуске кода в искровой оболочке, мне пришлось добавить «;» перед Vectors.dense (vs). Есть ли у вас рекомендации относительно создания среды для тестирования таких прототипов? До сих пор я использовал простой текстовый редактор и искровую оболочку, но мне интересно, есть ли лучший подход. – Jacob
Я добавил несколько комментариев - я надеюсь, что это поможет (и, пожалуйста, не забывайте повышать). Лично я использую REPL и my-favorite-editor (последняя часть зависит от языка и языка). Для сложных, многоразовых компонентов я иногда использую IntelliJ IDEA, но прототипирование все еще намного быстрее в REPL, это последнее средство. – zero323
Я ценю это @ zero323, у меня есть ответ на ваш ответ. – Jacob