#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)
и проверьте, все ли в порядке