Я знаю, что 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 ГБ, у меня будут другие результаты.
Вопросы:
- Даже если сортировка здесь не рекомендуется, у меня должен быть тот же самый правильный результат?
- Мой запрос сортирует все разделы автоматически?
- Для топ-проблемы N, я думаю, сортировка должна быть очень тяжелой. Может быть, есть гораздо лучшие модели? Как получить максимальные значения для каждого раздела, а затем отсортировать?
Это реализация github