Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么是在Scala中应用基于相对计数的资格标准来激发数据帧的有效方法?_Scala_Apache Spark_Apache Spark Sql - Fatal编程技术网

什么是在Scala中应用基于相对计数的资格标准来激发数据帧的有效方法?

什么是在Scala中应用基于相对计数的资格标准来激发数据帧的有效方法?,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,我是Scala的新手,我非常感谢任何专家的建议。 我需要在一个非常大的spark数据帧(几十条或数亿条记录)上按特定顺序验证几个资格标准。我目前的方法非常慢,而且在长时间运行中经常失败 以下是完整的描述(可共享调整和更改): 我有一个数据集,它有几个列(我们称它们为col1到col3)。另一种方法查看这些列并确定此记录符合条件的组/子组,并将其存储在eligibilities列中: +------------------------------------------------------+

我是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  |
+-------------------------------+    
现在我应用决策逻辑如下:

  • 按包含a1的行的可用性筛选分组数据集
  • 对计数列求和
  • 如果大于阈值。将它们指定给a1并删除行,否则忽略
  • 转到1并执行a2、a3、b1、b2等
  • 以下是我的代码的一般流程:

    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方法来实现这一目标