首页 > 解决方案 > 使用 pyspark 中的 groupBy 函数使用 QuantileDiscretizer 进行分桶

问题描述

我有一个像这样的大型数据集:

| SEQ_ID|RESULT|
+-------+------+
|3462099|239.52|
|3462099|239.66|
|3462099|239.63|
|3462099|239.64|
|3462099|239.57|
|3462099|239.58|
|3462099|239.53|
|3462099|239.66|
|3462099|239.63|
|3462099|239.52|
|3462099|239.58|
|3462099|239.52|
|3462099|239.64|
|3462099|239.71|
|3462099|239.64|
|3462099|239.65|
|3462099|239.54|
|3462099| 239.6|
|3462099|239.56|
|3462099|239.67|

RESULT列按SEQ_ID列分组。RESULT我想根据每组的计数来分桶/分箱。应用一些聚合后,我有一个数据框,其中包含每个SEQ_ID必须分箱的桶数。像这样:

| SEQ_ID|num_buckets|
+-------+----------+
|3760290|        12|
|3462099|         5|
|3462099|         5|
|3760290|        13|
|3462099|        13|
|3760288|        10|
|3760288|         5|
|3461201|         6|
|3760288|        13|
|3718665|        18|

例如,这告诉我RESULT属于 3760290 的值SEQ_ID必须分箱到 12 个桶中。

对于单个组,我会重视并执行以下操作collect()num_buckets

discretizer = QuantileDiscretizer(numBuckets=num_buckets, inputCol='RESULT', outputCol='buckets')
df_binned=discretizer.fit(df).transform(df)

我知道在使用时QuantileDiscretizer,每个组都会产生一个单独的数据框,然后我可以将它们全部合并。但是如何在不使用循环QuantileDiscretizer的情况下对各个组进行分类?for

标签: apache-sparkpysparkapache-spark-sqlquantile

解决方案


推荐阅读