искра динамически сгруппировать по нескольким столбцам - PullRequest
0 голосов
/ 08 января 2020

Я новичок в Spark, и у меня есть требование сгруппировать несколько столбцов для кадра данных, который выглядит как схема ниже.

root
 |-- Id: integer (nullable = true)
 |-- Traffic Volume Count Location Address: string (nullable = true)
 |-- Street: string (nullable = true)
 |-- Date of Count: string (nullable = true)
 |-- Total Passing Vehicle Volume: integer (nullable = true)
 |-- Vehicle Volume By Each Direction of Traffic: string (nullable = true)
 |-- Latitude: double (nullable = true)
 |-- Longitude: double (nullable = true)
 |-- Location: string (nullable = true)

И мне нужно сгруппировать два столбца, скажем Street и Total Passing Vehicle Volume для которого приведенный ниже код выглядит следующим образом:

trafficDf.groupBy("Street","Total Passing Vehicle Volume").count().orderBy("Street").show(100)

Но проблема в том, сколько столбцов мне нужно для группировки, я не знаю заранее, это что-то информация о времени выполнения, которую я получу как json и из json мне нужно извлечь столбец, по которому мне нужно выполнить группировку.

Я знаю, что могу преобразовать свой dataframe в таблицу по createOrReplaceTempView, где я могу запустить SQL запрос поверх этого. Но мне интересно, что должен быть какой-то способ без написания SQL.



Что я знаю df.select(), что я могу взять expr() как:

df.select(expr("Id as new_Id, Street as new_Street")).show()

Если то же самое я передаю groupBy() Я получаю ошибку:

var dynamic_condition="Street, Total Passing Vehicle Volume" // this will be created from json where i'll get column names by looping through runtime info
trafficDf.groupBy(expr(dynamic_condition)).count().show()

Ошибка:

mismatched input ',' expecting <EOF>(line 1, pos 6)

== SQL ==
Street, Total Passing Vehicle Volume

Я делаю что-то не так Я проверил документацию из groupBY() также я думаю, что это не может принять expr() в качестве аргумента или может быть. Любая помощь будет оценена

Примечание: я знаю, что это возможно, написав запрос SQL поверх фрейма данных, но я пытаюсь другим способом.

1 Ответ

2 голосов
/ 08 января 2020

В приведенном выше примере вы передаете список столбцов как String, вам нужно передать его как List[String]

Из документации API

def groupBy(col1: String, cols: String*): RelationalGroupedDataset

Пример фрагмент кода показан ниже


def dynamicGroup(df: DataFrame, cols: List[String] ): DataFrame = {
  df.groupBy(cols.head, cols.tail: _*)
}

Вы можете затем назвать его, как показано ниже

val listOfStrings =  List("A", "B", "C")
val result = dynamicGroup(df, listOfStrings)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...