org.apache.spark.sql.AnalysisException: не удается разрешить указанные входные столбцы
exitTotalDF
.filter($"accid" === "dc215673-ef22-4d59-0998-455b82000015")
.groupBy("exiturl")
.agg(first("accid"), first("segment"), $"exiturl", sum("session"), sum("sessionfirst"), first("date"))
.orderBy(desc("session"))
.take(500)
org.apache.spark.sql.AnalysisException: cannot resolve '`session`' given input columns: [first(accid, false), first(date, false), sum(session), exiturl, sum(sessionfirst), first(segment, false)]
Это как функция суммы не может найти имена столбцов должным образом.
Использование Spark 2.1
2 ответа
Обычно в подобных сценариях я буду использовать as
метод на столбце. Например .agg(first("accid"), first("segment"), $"exiturl", sum("session").as("session"), sum("sessionfirst"), first("date"))
, Это дает вам больший контроль над тем, что ожидать, и если имя суммирования когда-либо изменится в будущих версиях spark, у вас будет меньше головной боли при обновлении всех имен в вашем наборе данных.
Кроме того, я просто провел простой тест. Когда вы не указываете имя, похоже, что имя в Spark 2.1 меняется на "sum(session)". Один из способов найти это самостоятельно - вызвать printSchema для набора данных.
Я предпочитаю использовать withColumnRenamed()
вместо as()
так как:
С as()
нужно перечислить все столбцы, в которых он нуждается:
df.select(first("accid"),
first("segment"),
$"exiturl",
col('sum("session")').as("session"),
sum("sessionfirst"),
first("date"))
В.С. withColumnRenamed
это один лайнер:
df1 = df.withColumnRenamed('sum("session")', "session")
Выход df1
будет иметь все столбцы, которые есть у df, за исключением того, что столбец sum("session") теперь переименован в "session"
Из spark2.0 spark-shell по умолчанию включен с улья. Мы можем отключить поддержку улья, используя команду ниже.
spark-shell --conf spark.sql.catalogImplementation=in-memory