Почему спарк-фрейм и набор данных имеют разные результаты? - PullRequest
0 голосов
/ 18 октября 2019

Я знаю, что DataFrame - это набор данных Row. Поэтому я получаю тот же результат, если использую набор данных или фрейм данных.

Я загрузил набор данных рекомендаций Expedia Hotel из kaggle . Просто для тестирования. У меня есть файл CSV 4 ГБ.

Я написал несколько простых искровых запросов:

Фрейм данных:

 val dr = spark.read.format(inputFormat.toString).option("header", "true").load(input)
 val result = dr.filter("SRCH_ADULTS_CNT==2")
    .groupBy("hotel_continent", "hotel_country",  "hotel_market")
    .count()
    .sort(desc("count"))
    .limit(3)

Все хорошо!

Я переписываю этот запрос и для набора данных:

   vl dr = spark.read.format(inputFormat.toString).option("header", "true").schema(schema).load(input)
   val ds: Dataset[Booking] = dr.as[Booking]
   result = ds.filter(p => p.srch_adults_cnt.equalsIgnoreCase("2"))
    .groupBy($"hotel_continent", $"hotel_country",  $"hotel_market")
    .count()
    .sort($"count".desc)
    .limit(3)

Все хорошо! Я написал модульный тест для использования файла CSV с 20 записями, оба запроса работают нормально.

НО, если я выполню запрос для файла CSV 4 ГБ, у меня будут другие результаты.

Вопросы:

  1. Даже если сортировка здесь не рекомендуется, у меня должен быть тот же самый правильный результат?
  2. Мой запрос сортирует все разделы автоматически?
  3. Для топ-проблемы N, я думаю, сортировка должна быть очень тяжелой. Может быть, есть гораздо лучшие модели? Как получить максимальные значения для каждого раздела, а затем отсортировать?

Это реализация github

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...