значение перегруженного метода выберите с альтернативами

#scala #apache-spark

Вопрос:

Я пытаюсь выбрать больше столбцов и привести их все, но получаю эту ошибку

«значение перегруженного метода выберите с альтернативами: (col: Строка,cols: Строка*)org.apache.spark.sql.Фрейм данных (cols: org.apache.spark.sql.Столбец*)org.apache.spark.sql.Фрейм данных не может быть применен к (org.apache.spark.sql.Столбец, org.apache.spark.sql.Столбец, строка)»

код такой:

 val result = df.select(
  col(s"${Constant.CS}_exp.${Constant.DATI_CONTRATTO}.${Constant.NUMERO_CONTRATTO}").cast(IntegerType),
  col(s"${Constant.CS}_exp.${Constant.DATI_CONTRATTO}.${Constant.CODICE_PORTAFOGLIO}").cast(IntegerType), 
  col(s"${Constant.CS}_exp.${Constant.RATEALE}.${Constant.STORIA_DEL_CONTRATTO}"))
 

Комментарии:

1. Я думаю, что ошибка означает, что компилятор не уверен, какой метод выбора использовать. У вас нет еще одного сообщения об ошибке (несколько строк)?

2. @Juh_ Да, это полная ошибка: значение перегруженного метода выберите с альтернативами: (col: Строка,cols: Строка*)org.apache.spark.sql.Фрейм данных <и> (cols: org.apache.spark.sql.Столбец*)org.apache.spark.sql.Фрейм данных не может быть применен к (org.apache.spark.sql.Столбец, org.apache.spark.sql.Столбец, строка)

Ответ №1:

Последняя часть сообщения об ошибке означает, что компилятор не может найти метод «select» с api, который соответствует вашему коду: select(Column, Column, String)

Однако компилятор нашел 2 возможных метода, но они не подходят:

  • select(col: String, cols: String*)
  • select(cols: Column*) ( * означает «любое количество»)

В этом я уверен.

Однако я не понимаю, почему вы получаете эту ошибку с кодом, который вы дали, который на самом деле select(Column, Column, Column) соответствует select(cols: Column*) api. По какой-то причине он считает последним аргументом а String . Возможно, некоторые скобки неправильно расставлены

Что я делаю в таких случаях, так это разделяю код для проверки типов:

 val col1: Column = col(s"${Constant.CS}_exp.${Constant.DATI_CONTRATTO}.${Constant.NUMERO_CONTRATTO}").cast(IntegerType)
val col2: Column = col(s"${Constant.CS}_exp.${Constant.DATI_CONTRATTO}.${Constant.CODICE_PORTAFOGLIO}").cast(IntegerType)
val col3: Column = col(s"${Constant.CS}_exp.${Constant.RATEALE}.${Constant.STORIA_DEL_CONTRATTO}")

val result = df.select(col1, col2, col3)
 

и проверьте, все ли в порядке