динамически передавать аргументы для функции в Scala - PullRequest
0 голосов
/ 02 июня 2018

у меня есть запись в виде строки с 1000 полями с разделителем в виде запятой в кадре данных, например

"a, b, c, d, e ....... до 1000" -1-я запись "p,q, r, s, t ...... до 1000 "- 2-я запись

Я использую предложенное ниже решение от stackoverflow

Разделить 1 столбец на 3 столбца в искреscala

df.withColumn("_tmp", split($"columnToSplit", "\\.")).select($"_tmp".getItem(0).as("col1"),$"_tmp".getItem(1).as("col2"),$"_tmp".getItem(2).as("col3")).drop("_tmp")

однако в моем случае у меня есть 1000 столбцов, которые у меня есть в схеме JSON, которые я могу получить как

column_seq:Seq[Array]=Schema_func.map(_.name)
for(i <-o to column_seq.length-1){println(i+" " + column_seq(i))}

, которые возвращаются как

0 col1 1 col2 2 col3 3 col4

Теперь мне нужно передать все эти индексы и имена столбцов в нижнюю функцию DataFrame

df.withColumn("_tmp", split($"columnToSplit", "\\.")).select($"_tmp".getItem(0).as("col1"),$"_tmp".getItem(1).as("col2"),$"_tmp".getItem(2).as("col3")).drop("_tmp")

в

$"_tmp".getItem(0).as("col1"),$"_tmp".getItem(1).as("col2"),

поскольку я не могу создать длинную инструкцию со всеми 1000 столбцами, есть ли эффективный способ передать все эти аргументы из вышеупомянутой схемы json для выбора функции, чтобы я мог разделить столбцы, добавить заголовок и затем преобразовать DF в паркет.

1 Ответ

0 голосов
/ 02 июня 2018

Вы можете построить серию org.apache.spark.sql.Column, где каждый является результатом выбора правильного элемента и имеет правильное имя, а затем select эти столбцы:

val columns: Seq[Column] = Schema_func.map(_.name)
  .zipWithIndex // attach index to names
  .map { case (name, index) => $"_tmp".getItem(index) as name }

val result = df
  .withColumn("_tmp", split($"columnToSplit", "\\."))
  .select(columns: _*)

Например,для этого ввода:

case class A(name: String)
val Schema_func = Seq(A("c1"), A("c2"), A("c3"), A("c4"), A("c5"))
val df = Seq("a.b.c.d.e").toDF("columnToSplit")

result будет:

// +---+---+---+---+---+
// | c1| c2| c3| c4| c5|
// +---+---+---+---+---+
// |  a|  b|  c|  d|  e|
// +---+---+---+---+---+
...