我想基于指定的预定义类别将源中的所有项目分组。每个类别的项目数可能约为数百万。 groupBy可以帮助我实现这一目标,但是我想了解是否在分组之前对产品类型进行重新分区会更有效?
spark作业的来源是配置单元表。 spark的版本是最新的2.4.4。我的问题陈述是,我想针对给定类别中的每个项目与其他所有项目运行定制的相似性算法。因此,在此操作结束时,对于每个项目,我将拥有与其最相似的10个项目。
由于这涉及一个groupBy操作,并且由于groupBy涉及数据改组,所以我认为首先我将根据类别对数据进行重新分区。我什至可以将分区数设置为我拥有的类别数(以100s为单位)。
一旦将数据重新分区发送给各个工作人员,则运行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"));
在此操作结束时,我已经能够将给定类别的所有项ID分组到一个列表中。像这样:
+---------------------------+------------------------------------------+
|category | ids |
+---------------------------+------------------------------------------+
|category-1 | [id1, id2...] |
|category-2 | [idx, idy...] |
+---------------------------+------------------------------------------+
我已经能够获得所需格式的数据,但想了解这种分组方式是否正确? 另外,执行collectList操作的含义是什么?它会加载内存中的所有内容吗?