Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pyspark Spark数据帧分组和按键分区,并具有一定数量的分区。_Pyspark_Apache Spark Sql - Fatal编程技术网

Pyspark 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

我有一个spark数据框,它有多个标签,每个标签和功能都对应,如下所示:

+----------------+--------------------+
|           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
我想实现的目标是:

  • 创建一个rdd,其中分区的数量等于唯一标签的数量,例如:rdd.getNumPartition()=没有唯一标签。 每个rdd条目都有多个功能,属于一个标签

  • 将每个rdd分区发送到服务函数

  • 我的实验到现在为止:

  • 在执行sdf.repartition('label')时,它会创建几个空数据帧

  • 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))
    
    如果有帮助,请告诉我