Как передать более одного столбца в качестве параметра в фрейм данных Spark

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

val readData = spark.sqlContext
  .read.format("csv")
  .option("delimiter",",")
  .schema(Schema)
  .load("emp.csv")

val cols_list1 = "emp_id,emp_dt"
val cols_list2 = "emp_num"

val RemoveDupli_DF = readData
  .withColumn("rnk", row_number().over(Window.partitionBy(s"$cols_list1").orderBy(s"$cols_list2") ))

Приведенный выше код работает, если у меня есть одно имя столбца, тогда как с двумя или более столбцами он дает ошибку ниже.

Исключение в потоке main org.apache.spark.sql.AnalysisException: не удается разрешить 'emp_id,emp_dt'

Используется версия Scala 2.x.


person john    schedule 08.09.2020    source источник


Ответы (1)


Метод partitionBy в виде нескольких подписей:

def partitionBy(colName: String, colNames: String*)
// or
def partitionBy(cols: Column*)

Ваш код предоставляет список столбцов в виде одной строки, которая завершится ошибкой, потому что нет столбца с именем emp_id,emp_dt. Следовательно, вы получаете сообщение об ошибке.

Вы можете определить имена столбцов (как строки) в коллекции

val cols_seq1 = Seq("emp_id","emp_dt")

а затем вызовите разделы следующим образом:

Window.partitionBy(cols_seq1: _*)

Обозначение : _* указывает компилятору передавать каждый элемент cols_seq1 в качестве собственного аргумента в вызов partitionBy, а не весь его как один аргумент.

В качестве альтернативы вы также можете просто использовать

Window.partitionBy("emp_id", "emp_dt")
person mike    schedule 08.09.2020
comment
Спасибо, Майк за ответ. Я получаю аналогичную проблему, как указано выше, и я пробовал, как показано ниже. val cols_list1 = Seq (col (emp_id), col (emp_dt)) val checkDupli = readData.withColumn (rnk, row_number (). over (Window.partitionBy (s $ cols_list1) .orderBy (s $ cols_list2))) Исключение в потоке main org.apache.spark.sql.AnalysisException: невозможно разрешить 'List(emp_id, emp_dt)' для заданных входных столбцов: Примечание: столбцы emp_id и emp_dt являются частью моего фрейма данных readData Не уверен, что здесь происходит не так. Оцените, есть ли какое-либо другое рабочее решение. - person john; 08.09.2020
comment
Думаю, чтобы получить искру для расширения вашего списка, мне нужно использовать cols_seq1:_*. - person Andrew; 08.09.2020