Pyspark中的随机样本,无重复

时间:2019-06-05 07:51:12

标签: python pyspark

我有一个Pyspark DataFrame,我想随机采样(从整个df中的任何地方)〜100k唯一ID。 DF是基于事务的,因此一个ID将出现多次,我想获得100k个不同的ID,然后从DF获取每个ID的所有交易记录。

我尝试过:

sample = df.sample(False, 0.5, 42)
sample = sample.distinct()

然后我不确定如何将其与原始Df匹配,另外一些ID也不干净,我希望能够在样本中加入一些条件,说明ID必须为10位数。

2 个答案:

答案 0 :(得分:2)

df
.where("length(ID) == 10") # only 10 digit ids
.select("ID").distinct()   # you want it unique on id
.sample(False, 0.5, 42)    # now you take the sample
.join(df, "ID")            # and finally join it

实际上,这并不难,因为您已经指出了所有必要的步骤。

答案 1 :(得分:1)

如果要确保一次又一次获取相同的数据集,我更喜欢使用哈希。这也是随机的。通过这种方法,您可以选择唯一ID的X%,因此,如果要获得约100k个ID,则需要进行一些数学运算。

import pyspark.sql.functions as F
df = df.wihtColumn("hash", F.hash(F.col("ID")) % 1000) # number between -999 and 999
df = df.filter("hash = 0")

您还应该检查分布,我认为您需要获取哈希的绝对值,因为它也可以是负数。

或者:

df = df.wihtColumn("hash", F.abs(F.hash(F.col("ID")) % 1000)) # number between 0 and 999

按照这种逻辑,您将或多或少地随机获得0.1%的ID。