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
Другие вопросы по тегам