程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了基于数据帧中出现频率的 Spark 数据帧随机采样大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决基于数据帧中出现频率的 Spark 数据帧随机采样?

开发过程中遇到基于数据帧中出现频率的 Spark 数据帧随机采样的问题如何解决?下面主要结合日常开发的经验,给出你关于基于数据帧中出现频率的 Spark 数据帧随机采样的解决方法建议,希望对你解决基于数据帧中出现频率的 Spark 数据帧随机采样有所启发或帮助;

输入说明
我有一个带有列 queryID 的输入数据框的 spark 作业。这个 queryID 对于数据帧不是唯一的。例如,spark 数据帧中大约有 300 万行,具有 45 万个不同的查询 ID。

问题
我正在尝试实现采样逻辑并创建一个新列 sampledqueryID,其中包含每个数据帧行的随机采样查询 ID,方法是从聚合 spark 数据帧查询 ID 集中查找查询 ID。

抽样目标

  1. 限制是采样查询 ID 不应等于输入查询 ID。
  2. 采样应该与传入 spark 数据帧中查询 ID 的出现频率相对应——即给定两个查询 ID q1 和 q2,如果出现的比率是 10:1(q1:q2),那么 q1 应该出现大约 10 次更多信息请参见示例 ID 列。

目前尝试的解决方案
我试图通过将查询 ID 收集到一个列表中并使用随机抽样查找查询 ID 列表来实现这一点,但是根据经验证据怀疑该逻辑没有按预期工作,例如我看到一个特定的查询 ID 被抽样 200次,但频率相似的查询 ID 永远不会被采样。

有关此火花代码是否按预期工作的任何建议?

val random = new scala.util.Random
val queryIDs = data.SELEct($"queryID").map(row => row.getAs[Long](0)).collect()
val samplequeryID = udf((queryID: Long) =>  {
      val sampledID = queryIDs(random.nexTint(queryIDs.length))
      if (sampledID != queryID) sampledID else null        
})
val dataWithSampledIDs = data.withcolumn("sampledqueryID",samplequeryID($"queryID"))

解决方法

为了后人的缘故,在不同的论坛上收到了回复。问题是通过 udf 将一个随机实例传递给所有执行程序。因此,每个执行程序的第 n 行将给出相同的输出。

scala> val random = new scala.util.Random
scala> val getRandom = udf((data: Long) => random.nexTint(10000))
scala> spark.range(0,12,1,4).withcolumn("rnd",getRandom($"id")).orderBy($"id").show
+---+----+
| id| rnd|
+---+----+
|  0|6720|
|  1|7667|
|  2|3344|
|  3|6720|
|  4|7667|
|  5|3344|
|  6|6720|
|  7|7667|
|  8|3344|
|  9|6720|
| 10|7667|
| 11|3344|
+---+----+

这个df有4个分区。每个第n行的rrd值相同(例如ID = 1,4,7,10相同)。解决方案是在Spark中使用rand()内置函数,如下所示。

val queryIds = data.SELEct($"queryId").map(row => row.getAs[Long](0)).collect()
val sampleQueryId = udf((CompanyId: Long,rand: DoublE) =>  {
      val sampledId = queryIds(scala.math.floor(rand*queryIds.length).toint)
      if (sampledId != queryId) sampledId else null        
})
val dataWithSampledIds = data.withcolumn("sampledQueryId",sampleQueryId($"queryId",rand()))


大佬总结

以上是大佬教程为你收集整理的基于数据帧中出现频率的 Spark 数据帧随机采样全部内容,希望文章能够帮你解决基于数据帧中出现频率的 Spark 数据帧随机采样所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。