#scala #apache-spark #apache-spark-sql
Вопрос:
У меня есть особая проблема. Я пытаюсь выбрать некоторые столбцы из фрейма данных, используя автоматически сгенерированные строки. В то время как выбор работает нормально, если я передаю их напрямую, если я помещаю одно и то же выражение в строки и передаю строку для выбора, он завершается ошибкой «Не удается разрешить имя столбца, заданное списком столбцов». Это каким-то образом добавляет обратные ссылки в строку и пытается найти полную строку в качестве имени столбца (вместо того, чтобы вычислять строковое выражение и использовать его в качестве имени столбца).
Примеры ниже:
Это работает, historyJoinedDF-это фрейм данных, который является результатом внешнего соединения между двумя фреймами данных:
historyJoinedDF.select( currentUnmatchedDF("sessiondetail_sessionid").as("sessiondetail_sessionid") ).show()
Это не работает:
val test = """currentUnmatchedDF("sessiondetail_sessionid").as("sessiondetail_sessionid")""" historyJoinedDF.select( test .show()
Терпит неудачу с:
cannot resolve '`currentUnmatchedDF("sessiondetail_sessionid").as("sessiondetail_sessionid")`' given input columns:
Не уверен, имеет ли это значение, но мой фрейм данных является результатом полного внешнего соединения между двумя фреймами данных с одной и той же схемой (поэтому необходимо указывать имена столбцов с именами DF).
Редактировать: добавление вывода currentUnmatchedDF.show(false) и historyJoinedDF .show(false) ниже, оба имеют несколько сотен столбцов (которые одинаковы), поэтому отображаются только столбцы, упомянутые в вопросе.
Комментарии:
1. currentUnmatchedDF-это UDF или фрейм данных ?
2. currentUnmatchedDF-это фрейм данных.
3. тогда как вы выбираете столбцы из фрейма данных historyJoinedDF, используя фрейм данных currentUnmatchedDF? это не очень хорошая практика.. можете ли вы объяснить схему обоих фреймов данных
4. Первый фрагмент кода является примером того, как Select работает нормально. Я отредактировал код, чтобы отразить один и тот же фрейм данных в обоих примерах, пожалуйста, ознакомьтесь.
5. Не могли бы вы также показать оба значения фрейма данных historyJoinedDF и currentUnmatchedDF. currentUnmatchedDF.show(ложь) и historyJoinedDF .show(ложь)
Ответ №1:
метод select принимает имена столбцов в качестве параметров. поэтому вам следует сделать что-то вроде
someDf.select("sessiondetail_sessionid")
или, если вы хотите получить столбцы других df и выбрать их в каком-либо df, который вы должны использовать
import org.apache.spark.sql.functions.col someDf.select(otherDf.columns.map(col): _*) //: _* transforms collection to varag
но вы пытаетесь получить столбец с буквальным именем
currentUnmatchedDF("sessiondetail_sessionid").as("sessiondetail_sessionid")
Комментарии:
1. Выбор принимает как строку, так и Кол. Кроме того, пожалуйста, посмотрите два примера, которые я привел, это прекрасно работает с жестко закодированной строкой, просто не работает со строковой переменной.
2. конечно, строка причины должна быть именем столбца, и вы передаете часть кода внутри строки. просто распечатайте test val из вашего примера, и вы увидите его
3. Но этот фрагмент кода вычисляется как строка и отлично работает, если передается непосредственно как строка, а не как строка val.
4. этот фрагмент кода не преобразуется в строку. он вычисляется в виде столбца. вы можете распечатать его и проверить
5. и даже если бы это оценивало, вы должны были бы делать
val str = s"${currentUnmatchedDF("sessiondetail_sessionid").as("sessiondetail_sessionid")}"
, но вы делаетеval str = """currentUnmatchedDF("sessiondetail_sessionid").as("sessiondetail_sessionid")"""