Почему «псевдоним счетчика групп» не создает новый столбец? - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть следующий код:

def getResults(df: DataFrame) : Dataset[Row] = {
df.filter(df("srch_adults_cnt") > 0)
  .filter(df("srch_children_cnt") > 0)
  .filter(df("is_booking") === 0)
  .groupBy("hotel_country", "hotel_market", "hotel_continent")
  .agg(count("*").alias("count"))
  .orderBy(df("count").desc)
  .limit(3)
}

в этой строке произошел сбой: .orderBy(df("count").desc), сказав, что такого столбца нет count. Почему это?

когда я заменил df("count").desc на desc("count"), он начал работать, но я не понимаю, почему. Может кто-нибудь объяснить?

1 Ответ

0 голосов
/ 10 ноября 2018

Поскольку df является исходным фреймом данных, и df ("count") пытается вернуть столбец, которого нет в исходном фрейме данных, фреймы данных являются неизменяемыми объектами, которые нельзя изменить, вы можете только преобразовать в очередь, возвращать новые фреймы данных без изменения исходного фрейма данных, поэтому groupby и agg не изменяют исходный df фрейм данных, но возвращают новые фреймы данных с преобразованиями в очереди (Spark is lazy).

desc ("count") - это функция, которая будет искать столбец с именем "count" в текущем фрейме данных, который не является оригинальным df , но созданный gorupby + agg , который уже имеет столбец "count".

Кстати, вы можете повторно использовать df в нескольких преобразованиях.

...