scala - 如何通过列上的组合并行化 apache spark 中数据帧的处理
问题描述
我正在寻找一种解决方案来构建具有所有列组合的聚合。例如,我有一个数据框如下:
val df = Seq(("A", 1), ("B", 2), ("C", 3), ("A", 4), ("B", 5)).toDF("id", "value")
+---+-----+
| id|value|
+---+-----+
| A| 1|
| B| 2|
| C| 3|
| A| 4|
| B| 5|
+---+-----+
并在“id”列上查找所有组合的聚合。在下面我找到了一个解决方案,但这不能使用 Spark 的并行性,仅适用于驱动程序节点或仅适用于单个执行程序。有没有更好的解决方案来摆脱 for 循环?
import spark.implicits._;
val list =df.select($"id").distinct().orderBy($"id").as[String].collect();
val combinations = (1 to list.length flatMap (x => list.combinations(x))) filter(_.length >1)
val schema = StructType(
StructField("indexvalue", IntegerType, true) ::
StructField("segment", StringType, true) :: Nil)
var initialDF = spark.createDataFrame(sc.emptyRDD[Row], schema)
for (x <- combinations) {
initialDF = initialDF.union(df.filter($"id".isin(x: _*))
.agg(expr("sum(value)").as("indexvalue"))
.withColumn("segment",lit(x.mkString("+"))))
}
initialDF.show()
+----------+-------+
|indexvalue|segment|
+----------+-------+
| 12| A+B|
| 8| A+C|
| 10| B+C|
| 15| A+B+C|
+----------+-------+
解决方案
推荐阅读
- html - 当输入是一个很长的不间断单词时,CSS text-indent 在 IE 中不起作用
- r - 在 keras r 中训练模型的最佳方法
- php - How to combine 2 arrays that have the same index and value with php?
- android - 无法将 RelativeLayout 转换为 ConstraintLayout
- amazon-sqs - 无服务器 SQS 消费者跳过消息
- powershell - 如何将结果导出到 .csv?ServerName 作为第一列,online/offline 作为第二列
- java - 如何在此代码中超越语法错误?
- ruby-on-rails - 在一个表中保存多个姓名和电子邮件
- batch-file - 如何在不列出命令的情况下执行命令?
- sql - SQL如何从列表中选择包含所有汽车的“id_owner”