2016-12-16 18 views
0

我想從存儲在配置單元表中的數據構建pyspark ML模型。數據是這樣的:如何爲Spark ML聚合長表中的功能

ID | value 
---+------ 
1 | 100 
1 | 101 
1 | 102 
2 | 101 
2 | 103 

使用純蜂房,我可以有選擇地使用collect_set的價值觀摺疊成產生這樣的蜂巢陣列:

ID | value 
---+----------- 
1 | (100, 101, 102) 
2 | (101, 103) 

的值是類別特徵。對於這個特殊的用例,我很好的將它們看作是稀疏向量1的索引,但是對於一般分類有一個解決方案將會很不錯。我想要做的是將這些值集中到一個特徵向量中,然後我可以將它們反饋給其中一個分類器。

我嘗試使用UDF將數組轉換爲VectorUDT,然後使用VectorIndexer()進行特徵化,但是當我嘗試這種方法時,它抱怨說所有向量的長度都不相同。

收集這些東西的正確方法是什麼?

回答

1

沒有什麼能阻止你在Spark SQL中使用collect_set。它只是非常昂貴。如果你不介意,你所需要的只是一堆進口:

from pyspark.sql.functions.import collect_set, udf, col 
from pyspark.ml.linag import SparseVector 

n = df.max("value").first[0] + 1 

to_vector = udf(lambda xs: SparseVector(n, {x: 1.0 for x in xs}) 

(df 
    .groupBy("id", collect_set(col("value")).alias("values")) 
    .select("id", to_vector(col("values")).alias("features"))) 
+0

但不說離開我在同一個地方,當我從蜂巢,這是說不同長度的載體得到它那不想構成特徵? –

+0

回想起後見之明,你udf中的'n'解決了我的問題。我最終預處理了collect_set,然後使用了一個非常不同的udf:udf(lambda l,maxlen:Vectors.sparse(maxlen,{v:1.0 for v in l}),VectorUDT())'一個重要的警告 - 爲此,必須對傳入的數組進行排序! –