2016-12-16 6 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の疎ベクトルへのインデックスとして考えることは問題ありませんが、一般的なカテゴリの解決策を用意するのがよいでしょう。StringIndexer()私がしたいのは、値を特徴ベクトルに集めて、分類子の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 for l)}、VectorUDT())を使用しました。これが渡されている配列をソートする必要があります! –

関連する問題