как объединить все столбцы в искровом фрейме данных, используя java? - PullRequest
0 голосов
/ 13 июля 2020

Вот как я делаю для 2 указанных c столбцов:

dataSet.withColumn("colName", concat(dataSet.col("col1"), lit(","),dataSet.col("col2") ));

, но dataSet.columns() возвращает массив Sting, а не массив столбцов. Как мне получить List<Column>?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 13 июля 2020

Простой способ - вместо df.columns используйте concat_ws(",","*"), проверьте код ниже.

df.withColumn("colName",expr("concat_ws(',',*)")).show(false)
+---+--------+---+-------------+
|id |name    |age|colName      |
+---+--------+---+-------------+
|1  |Srinivas|29 |1,Srinivas,29|
|2  |Ravi    |30 |2,Ravi,30    |
+---+--------+---+-------------+
0 голосов
/ 13 июля 2020

Java имеет более подробный синтаксис. Попробуйте это -

 df.withColumn("colName",concat_ws(",", toScalaSeq(Arrays.stream(df.columns()).map(functions::col).collect(Collectors.toList()))));

Используйте указанную ниже утилиту для преобразования списка java в scala seq-

  <T> Buffer<T> toScalaSeq(List<T> list) {
        return JavaConversions.asScalaBuffer(list);
    }
0 голосов
/ 13 июля 2020

Доброе утро, джорадани.

Вы можете использовать

import org.apache.spark.sql.functions.col

val testDataFrame = Seq(("A", 1)).toDF("First", "Second")
 
testDataFrame.columns.map(a => col(a)).toList

Что вернет res1: List[org.apache.spark.sql.Column] = List(First, Second)

...