Pyspark:如何将行分组为N个组?

Pyspark:如何将行分组为N个组?,pyspark,Pyspark,我正在pyspark脚本中执行df.groupBy().apply(),并希望创建一个自定义列,将我的所有行分组为N个(尽可能均匀,所以是rows/N)组。因此,我可以确保每次脚本运行时发送到udf函数的组数 如何使用pyspark进行此操作?如果需要精确拆分,则需要窗口化 import pyspark.sql.functions as F from pyspark.sql import Window #Test data tst = sqlContext.createDataFrame([(1

我正在pyspark脚本中执行
df.groupBy().apply()
,并希望创建一个自定义列,将我的所有行分组为N个(尽可能均匀,所以是rows/N)组。因此,我可以确保每次脚本运行时发送到udf函数的组数


如何使用pyspark进行此操作?

如果需要精确拆分,则需要窗口化

import pyspark.sql.functions as F
from pyspark.sql import Window
#Test data
tst = sqlContext.createDataFrame([(1,2,3,4),(3,2,5,4),(5,3,7,5),(7,3,9,5),(1,2,3,4),(3,2,5,4),(5,3,7,5),(7,3,9,5),(1,2,3,4),(3,2,5,4),(5,3,7,5),(7,3,9,5),(1,2,3,4),(3,2,5,4),(5,3,7,5),(7,3,9,5)],schema=['col1','col2','col3','col4'])
w=Window.orderBy(F.lit(1))
tst_mod = tst.withColumn("id",(F.row_number().over(w))%3) # 3 is the group size in this example

tst_mod.show()
+----+----+----+----+---+
|col1|col2|col3|col4| id|
+----+----+----+----+---+
|   5|   3|   7|   5|  1|
|   3|   2|   5|   4|  2|
|   5|   3|   7|   5|  0|
|   7|   3|   9|   5|  1|
|   1|   2|   3|   4|  2|
|   7|   3|   9|   5|  0|
|   1|   2|   3|   4|  1|
|   5|   3|   7|   5|  2|
|   7|   3|   9|   5|  0|
|   1|   2|   3|   4|  1|
|   3|   2|   5|   4|  2|
|   5|   3|   7|   5|  0|
|   3|   2|   5|   4|  1|
|   7|   3|   9|   5|  2|
|   3|   2|   5|   4|  0|
|   1|   2|   3|   4|  1|
+----+----+----+----+---+

tst_mod.groupby('id').count().show()
+---+-----+
| id|count|
+---+-----+
|  1|    6|
|  2|    5|
|  0|    5|
+---+-----+
如果你同意正态分布,那么你可以尝试一种叫做盐析的技术

import pyspark.sql.functions as F
from pyspark.sql import Window
#Test data
tst = sqlContext.createDataFrame([(1,2,3,4),(3,2,5,4),(5,3,7,5),(7,3,9,5),(1,2,3,4),(3,2,5,4),(5,3,7,5),(7,3,9,5),(1,2,3,4),(3,2,5,4),(5,3,7,5),(7,3,9,5),(1,2,3,4),(3,2,5,4),(5,3,7,5),(7,3,9,5)],schema=['col1','col2','col3','col4'])
tst_salt= tst.withColumn("salt", F.rand(seed=10)*3)

如果按列salt分组,则将有一个正态分布组如果需要精确拆分,则需要窗口化

import pyspark.sql.functions as F
from pyspark.sql import Window
#Test data
tst = sqlContext.createDataFrame([(1,2,3,4),(3,2,5,4),(5,3,7,5),(7,3,9,5),(1,2,3,4),(3,2,5,4),(5,3,7,5),(7,3,9,5),(1,2,3,4),(3,2,5,4),(5,3,7,5),(7,3,9,5),(1,2,3,4),(3,2,5,4),(5,3,7,5),(7,3,9,5)],schema=['col1','col2','col3','col4'])
w=Window.orderBy(F.lit(1))
tst_mod = tst.withColumn("id",(F.row_number().over(w))%3) # 3 is the group size in this example

tst_mod.show()
+----+----+----+----+---+
|col1|col2|col3|col4| id|
+----+----+----+----+---+
|   5|   3|   7|   5|  1|
|   3|   2|   5|   4|  2|
|   5|   3|   7|   5|  0|
|   7|   3|   9|   5|  1|
|   1|   2|   3|   4|  2|
|   7|   3|   9|   5|  0|
|   1|   2|   3|   4|  1|
|   5|   3|   7|   5|  2|
|   7|   3|   9|   5|  0|
|   1|   2|   3|   4|  1|
|   3|   2|   5|   4|  2|
|   5|   3|   7|   5|  0|
|   3|   2|   5|   4|  1|
|   7|   3|   9|   5|  2|
|   3|   2|   5|   4|  0|
|   1|   2|   3|   4|  1|
+----+----+----+----+---+

tst_mod.groupby('id').count().show()
+---+-----+
| id|count|
+---+-----+
|  1|    6|
|  2|    5|
|  0|    5|
+---+-----+
如果你同意正态分布,那么你可以尝试一种叫做盐析的技术

import pyspark.sql.functions as F
from pyspark.sql import Window
#Test data
tst = sqlContext.createDataFrame([(1,2,3,4),(3,2,5,4),(5,3,7,5),(7,3,9,5),(1,2,3,4),(3,2,5,4),(5,3,7,5),(7,3,9,5),(1,2,3,4),(3,2,5,4),(5,3,7,5),(7,3,9,5),(1,2,3,4),(3,2,5,4),(5,3,7,5),(7,3,9,5)],schema=['col1','col2','col3','col4'])
tst_salt= tst.withColumn("salt", F.rand(seed=10)*3)

如果您按列salt分组,您将拥有一个正态分布组

您可以添加样本输入和预期输出吗?您可以添加样本输入和预期输出吗?谢谢,正是我所需要的!我会试试的。谢谢,正是我需要的!我会试一试的。