我有一个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位数。
答案 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。