【问题标题】:Pyspark: Sample full groups of data based on an indicator columnPyspark:基于指标列对完整数据组进行采样
【发布时间】:2020-07-23 04:12:44
【问题描述】:

我是 Spark 的新手,希望随机分割数据。

假设我有这样的数据:

+------+-------+-------+-------+
| Col1 | Col2  | Col3  | Col3  |
+------+-------+-------+-------+
| A    | 0.532 | 0.234 | 0.145 |
| B    | 0.242 | 0.224 | 0.984 |
| A    | 0.152 | 0.753 | 1.413 |
| C    | 0.149 | 0.983 | 0.786 |
| D    | 0.635 | 0.429 | 0.683 |
| E    | 0.938 | 0.365 | 0.328 |
| C    | 0.293 | 0.956 | 0.963 |
| D    | 0.294 | 0.234 | 0.298 |
| E    | 0.294 | 0.394 | 0.928 |
| D    | 0.294 | 0.258 | 0.689 |
| A    | 0.687 | 0.666 | 0.642 |
| C    | 0.232 | 0.494 | 0.494 |
| D    | 0.575 | 0.845 | 0.284 |
+------+-------+-------+-------+

但是,col1 有更多不同的组/类别。并且我想通过Col1随机分配,意思是Col A的所有记录,如果Col A如此随机选择,将转到RDD1。

  • 30% 去一个 RDD
  • 另外 30% 的人去另一个 RDD
  • 另外 30% 用于第三个 RDD
  • 最后 10% 用于第四个 RDD

当我们说 30% 时,我们的意思是 Col1 的唯一值的 30%。所以,如果我的 Col1 标签是:[A,B,C,D,E,F,G,H,I,J],这些标签中的 3 个和所有相关的行都进入第一个分组,等等。

我可以想象一系列: .map() 函数,其中我发出一个元组(Col1_Label,[0 到 3 之间的随机值,每个概率为 0.3、0.3、0.3、0.1]),然后进行后续过滤.

有没有更简单的方法和方法可以让我分配种子来复制结果?

【问题讨论】:

    标签: python apache-spark random pyspark


    【解决方案1】:

    您可以使用随机拆分来拆分数据,然后进行连接。

    tst_id =tst.select('col1').distinct()
    # Random split may have incosistent behaviour - https://kb.databricks.com/data/random-split-behavior.html
    tst_id.cache()
    cnt = tst_id.count()
    id_split=tst_id.randomSplit([0.3,0.3,0.3,0.1])
    df_res=[]
    for i in range(len(id_split)):
        df_res.append(tst.join(id_split[i],on='col1',how='left_semi'))
    

    现在 df_res 是一个包含分组的数据帧数组,您可以使用 .rdd() 函数将它们转换为 rdd

    【讨论】:

      猜你喜欢
      • 2018-12-18
      • 2017-08-20
      • 2018-08-21
      • 2020-12-28
      • 2012-03-10
      • 2017-05-28
      • 1970-01-01
      • 2011-12-17
      • 1970-01-01
      相关资源
      最近更新 更多