我们的一个业务案例要求我们为较大数据集中的每个子分组(在下面的示例中为-apple,orange)数据子集运行PCA算法,即,我们要运行一个PCA对于 Type == Apple 的记录,分别使用算法;对于 Type == Orange 的记录,使用另一个PCA。
总体数据集通常包含大约5-6百万条记录,并具有100-200个特征。 类型列中的唯一值数量可能约为50K-60K。
我们想在使用python语言的spark环境中按类型值运行PCA算法。请在下面找到我可以标准化记录并运行PCA算法的python代码。但是,PCA算法是使用pyspark而不是 subgrouped 数据集运行整个数据集的。
目前,我一直坚持为分组数据集实施优化的Version PCA算法。任何帮助或指示,我们将不胜感激。
df = spark.createDataFrame(
[("20181028","Apple",1,3,4,5),
("20181029","Apple",10,2,6,7),
("20181128","Orange",12,19,7,16),
("20181129","Orange",9,7,3,5),
("20181120","Orange",6,3,4,5)],
("Date", "Type","F1","F2","F3","F4")
)
df.show()
#Create vector
assembler = VectorAssembler(inputCols=["F1","F2","F3","F4"], outputCol="features")
VectorOutput = assembler.transform(df)
#standardize the input feature
scaler = StandardScaler(inputCol="features", outputCol="scaledFeatures",withStd=True, withMean=True)
scalerModel = scaler.fit(VectorOutput)
scaledData = scalerModel.transform(VectorOutput)
#Run PCA algo
pca = PCA(k=2, inputCol="scaledFeatures", outputCol="pcaFeatures")
model = pca.fit(scaledData)
result = model.transform(scaledData).select("Date","Type","pcaFeatures")
#Show the result
result.show(50,truncate=False)
+--------+------+---+---+---+---+
| Date| Type| F1| F2| F3| F4|
+--------+------+---+---+---+---+
|20181028| Apple| 1| 3| 4| 5|
|20181029| Apple| 10| 2| 6| 7|
|20181128|Orange| 12| 19| 7| 16|
|20181129|Orange| 9| 7| 3| 5|
|20181120|Orange| 6| 3| 4| 5|
+--------+------+---+---+---+---+
+--------+------+-----------------------------------------+
|Date |Type |pcaFeatures |
+--------+------+-----------------------------------------+
|20181028|Apple |[1.5045340541317065,-0.9528611894036658] |
|20181029|Apple |[-0.19719398621559137,0.6812534757461064]|
|20181128|Orange|[-2.9560149391613217,-0.3754979381651896]|
|20181129|Orange|[0.6717104866798362,0.5707559972381819] |
|20181120|Orange|[0.9769643845653697,0.07634965458456777] |
+--------+------+-----------------------------------------+
我已经有一个现有案例的python实现,在这里我将遍历每个Type并建立模型。以下是我的实现方式的伪代码
foreach item in Type.Distinct()
Filter the records corresponding to item
Run PCA algorithm
Append the result to output Dataset
但是,我想在Spark中实现其功能-例如,对数据进行分区,运行pca,以使pca的多个实例跨各种执行程序运行,等等。我还想知道是否有任何方法可以使用RDD对来解决其中key是类型,值是属于特定类型的所有记录。