Spark SQL - группировка после перераспределения - PullRequest
0 голосов
/ 10 ноября 2019

Я хочу сгруппировать все элементы в источнике на основе указанной предварительно определенной категории. Количество предметов в категории может составлять порядка миллионов. GroupBy помогает мне достичь этого, но я хочу понять, будет ли более эффективным перераспределение по типу продукта перед группировкой?

Источником искровых заданий являются таблицы кустов. Версия spark последняя 2.4.4. Задача для меня состоит в том, что я хочу запустить индивидуальный алгоритм подобия для каждого элемента с каждым другим элементом в данной категории. Таким образом, к концу этой операции для каждого элемента у меня будет 10 наиболее похожих элементов.

Так как это включает в себя операцию groupBy, а поскольку groupBy включает перетасовку данных, я подумал, что сначала я передам данные на основе категории. Я даже могу установить количество разделов на количество категорий, которые у меня есть (в величине 100 с).

После перераспределения данных, отправленных отдельным работникам, запуск groupBy должен быть локальной операцией, если я выполняю groupBy для того же типа. Это предположение верно?

// For demo, I am reading from CSV. The final source is a hive table
Dataset<Row> rows = spark.read().option("sep", "\t")
                .csv("<some path>")
                .repartition(20, new Column("category"))
                .cache();
Dataset<Row> ids_grouped_by_category = rows.map((MapFunction<Row, Row>) items -> {
           // Some transformation returns a row in the format I need.
            return new-row;
        }, <encoder>)
                .groupBy(functions.col("category"))
                .agg(functions.collect_list("category").as("ids"));

В конце этой операции я смог сгруппировать все идентификаторы предметов для данной категории в список. Примерно так:

+---------------------------+------------------------------------------+
|category                   |     ids                                  |
+---------------------------+------------------------------------------+
|category-1                 | [id1, id2...]                            |
|category-2                 | [idx, idy...]                            |
+---------------------------+------------------------------------------+

Мне удалось получить данные в нужном мне формате, но я хотел понять, является ли этот способ правильной группировки? Кроме того, каковы последствия выполнения операции collectList? Он загружает все в память?

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