Scala Spark:在Spark中有没有datafu.pig.sampling.SampleByKey的替代品?

问题描述 投票:0回答:1

SampleByKey的取样方法是将密钥转换为哈希值,从中得到一个双值,然后根据提供的概率进行测试。 从一个密钥中得到的双值是均匀分布在0和1之间的。 代号 鏈接.所有具有相同键的行,都会以这种方式进行采样。

我有一个Dataframe,它是通过对多个Dataframe(它们都有相同的模式)进行联合操作形成的。我有兴趣做的是,每个单独的数据框有一个 column X,并说一个值 y 中存在。该值 y 也会出现在其他几个数据框中。如果我对这个数据帧进行取样,无论是单独的还是后联合的,我怎样才能确保被取样的数据包含了所有的数据,这些数据的值是 y 在于 column X ? 类似于SampleByKey的工作方式。

我通过 sample DataFrame's的API,但好像不是这样工作的.谁能帮帮我!

scala apache-spark apache-spark-sql apache-pig
1个回答
0
投票

这是一个 stratified sampling. Spark有更强大的采样算法实现

  1. 泊松抽样算法
  2. 伯努利抽样算法

您可以将您的 dataframeRDD[(K, V)] 又名 PairRDD 然后你可以使用对rdd函数 sampleByKey,检查这个 源头-

  def sampleByKey(withReplacement: Boolean,
      fractions: Map[K, Double],
      seed: Long = Utils.random.nextLong): RDD[(K, V)]

更多信息 分层抽样

为了得到所有具有 y 从列 x

// specify the exact fraction desired from each key
val fractions = Map("y" -> 1)// for all rows 1, for 50% rows use 0.5 etc.

// Get an exact sample from each stratum
// here data is RDD[(x, <any_other_col>)]
val exactSample = data.sampleByKeyExact(withReplacement = false, fractions = fractions)
© www.soinside.com 2019 - 2024. All rights reserved.