Конкат всех столбцов фрейма данных с использованием сгиба, уменьшение с помощью Spark / Scala - PullRequest
0 голосов
/ 05 февраля 2019

С динамической генерацией столбцов хорошо работает следующее:

import org.apache.spark.sql.functions._
import sqlContext.implicits._
import org.apache.spark.sql.DataFrame

val input = sc.parallelize(Seq(
   ("a", "5a", "7w", "9", "a12", "a13") 
   )).toDF("ID", "var1", "var2", "var3", "var4", "var5")

val columns_to_concat = input.columns
input.select(concat(columns_to_concat.map(c => col(c)): _*).as("concat_column")).show(false)

возвращает:

+-------------+
|concat_column|
+-------------+
|a5a7w9a12a13 |
+-------------+

Как это сделать с foldLeft, reduLeft - покасохранение динамической генерации столбца?

Я всегда получаю либо ошибку, либо возвращаемое нулевое значение.Хотя concat достаточно, мне любопытно, как складчатость и т. Д. Может работать.

1 Ответ

0 голосов
/ 05 февраля 2019

Это определенно не тот путь, которым нужно идти *, но если вы рассматриваете его как упражнение по программированию:

import org.apache.spark.sql.functions.{col, concat, lit}

columns_to_concat.map(col(_)).reduce(concat(_, _))

или

columns_to_concat.map(col(_)).foldLeft(lit(""))(concat(_, _))

* Потому что

  • Это сложное решение для того, что уже предоставлено высокоуровневым API.
  • Поскольку для выравнивания рекурсивного выражения требуется дополнительная работа планировщика / оптимизатора,не говоря уже о том, что выражение не использует рекурсию хвостового вызова и может просто переполниться.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...