【问题标题】:Random sample in Pyspark without duplicatesPyspark 中的随机样本没有重复
【发布时间】:2019-10-20 17:08:13
【问题描述】:

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

【问题讨论】:

    标签: python pyspark


    【解决方案1】:
    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
    

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

    【讨论】:

      【解决方案2】:

      如果我想确保一次又一次地获得相同的数据集,我更喜欢使用哈希。这也有点随机。使用这种方法,您可以选择 X% 的唯一 ID,因此如果您想拥有大约 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。

      【讨论】:

      • 根据您的数据集的大小,我总是希望避免加入。这将需要更多时间。
      猜你喜欢
      • 2021-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-27
      • 2023-03-19
      • 2020-08-31
      • 2013-05-01
      • 1970-01-01
      相关资源
      最近更新 更多