Pyspark Spark数据帧分组和按键分区,并具有一定数量的分区。
我有一个spark数据框,它有多个标签,每个标签和功能都对应,如下所示:Pyspark Spark数据帧分组和按键分区,并具有一定数量的分区。,pyspark,apache-spark-sql,Pyspark,Apache Spark Sql,我有一个spark数据框,它有多个标签,每个标签和功能都对应,如下所示: +----------------+--------------------+ | label| feature_paths| +----------------+--------------------+ | person1|[-0.015756417, 0....| | person1|[-0.05177306, 0.1...| | per
+----------------+--------------------+
| label| feature_paths|
+----------------+--------------------+
| person1|[-0.015756417, 0....|
| person1|[-0.05177306, 0.1...|
| person1|[-0.11631858, 0.1...|
| person2|[-0.058303248, 0....|
| person2|[-0.03415013, 0.0...|
+----------------+--------------------+
我想为每个标签(个人)训练一个集群模型,所以基本上,我想为每个标签创建一个rdd,然后运行像rdd.map(service)
这样的映射操作,这将最终为每个实体保存一个gmm
模型
代码如下:
def service(rddentry):
label = rddentry[0]
features = rddentry[1]
print(label)
from sklearn.mixture import BayesianGaussianMixture
from sklearn.externals import joblib
gmm = BayesianGaussianMixture(n_components=3, covariance_type="diag", init_params='kmeans')
model = gmm.fit(features)
joblib.dump(model, str(label)+'.joblib')
return model
我想实现的目标是:
sdf.partionBy('label')
也不起作用。它创建随机数目的分区我已经花了将近两天的时间,但到目前为止还没有具体的结果。任何方向正确的帮助或指导都会有所帮助 您可以将
partitionBy
与newhashpartitioner(分区数)
计算唯一标签计数需要一个额外的操作,您可以将其用作所需分区的数量
这是示例,注意:您需要一个成对的RDD来完成此操作。因此,在重新分区之后,您可以map
从元组中获取必要的时间
scala> val data = sc.parallelize(List("1","1","1","2","3","4","4","4"),4)
scala> data.glom.collect
res20: Array[Array[String]] = Array(Array(1, 1), Array(1, 2), Array(3, 4), Array(4, 4))
scala> val data_repart = data.keyBy(x=>x).partitionBy(new HashPartitioner(data.distinct.count.toInt))
scala> data_repart.glom.collect
res21: Array[Array[(String, String)]] = Array(Array((4,4), (4,4), (4,4)), Array((1,1), (1,1), (1,1)), Array((2,2)), Array((3,3)))
scala> data_repart.map(_._2).glom.collect
res22: Array[Array[String]] = Array(Array(4, 4, 4), Array(1, 1, 1), Array(2), Array(3))
如果有帮助,请告诉我