什么是在Scala中应用基于相对计数的资格标准来激发数据帧的有效方法?
我是Scala的新手,我非常感谢任何专家的建议。 我需要在一个非常大的spark数据帧(几十条或数亿条记录)上按特定顺序验证几个资格标准。我目前的方法非常慢,而且在长时间运行中经常失败 以下是完整的描述(可共享调整和更改): 我有一个数据集,它有几个列(我们称它们为col1到col3)。另一种方法查看这些列并确定此记录符合条件的组/子组,并将其存储在eligibilities列中:什么是在Scala中应用基于相对计数的资格标准来激发数据帧的有效方法?,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,我是Scala的新手,我非常感谢任何专家的建议。 我需要在一个非常大的spark数据帧(几十条或数亿条记录)上按特定顺序验证几个资格标准。我目前的方法非常慢,而且在长时间运行中经常失败 以下是完整的描述(可共享调整和更改): 我有一个数据集,它有几个列(我们称它们为col1到col3)。另一种方法查看这些列并确定此记录符合条件的组/子组,并将其存储在eligibilities列中: +------------------------------------------------------+
+------------------------------------------------------+
| col1 | col2 | col3 | eligibilities |
+ -----------------------------------------------------+
| x1 | y1 | z1 | A, a1, a2, B |
| x2 | y2 | z2 | A,a1 |
| x3 | y3 | z3 | A,a2, a3, B, b1 |
| x4 | y4 | z3 | A,a2 |
| x1 | y2 | z2 | A,a3,a2,B |
| x2 | y4 | z1 | A,a2,B |
| ... | ... | ... | ... |
+ -----------------------------------------------------+
现在给出A组和B组,以及子组a1、a2、a3和b1。如果每个子组都达到了最小计数限制,则我需要验证,因为每行只能分配给一个子组,并且计数不包括已分配的子组。
这部分逻辑需要几个计数命令,速度非常慢。为了使它更容易,我首先按“eligibilities”分组并计算行数,然后在分组的数据集上应用上述逻辑
+-------------------------------+
| eligibilities | count |
+-------------------------------+
| A, a1, a2, B | 120000 |
| A, a1. | 43000 |
| A, a2, a3, B, b1 | 321000 |
| A,a3,a2,B. | 5800 |
+-------------------------------+
现在我应用决策逻辑如下:
val subgroups = list("a1","a2","a3","b1")
var dfG = dfx.groupBy("eligibilities").count()
subgroups.foreach { subgroup =>
val filtered_df = dfG.filter(col("eligibilities").contains(subgroup))
if (filtered_df(2).count() > 1) {
val rowCount = filtered_df(col("count")).rdd.map(_ (0).asInstanceOf[Long]).reduce(_ + _)
if (rowCount > threshold) {
dfG = dfG.filter(not(col("eligibilities").contains(subgroup)))
}
}
}
是否有更好的Spark/Scala方法来实现这一目标