2016-10-01 5 views
0

SparkのmlライブラリからHashingTFから取得したDataFrame [SparseVector]があります。 - 機能の1 = 2147483647数(最大)SparkのDataframe [SparseVector]からすべての非ゼロ値を取得するには?

root 
|-- docId: string (nullable = true) 
|-- docNGrams: array (nullable = true) 
| |-- element: string (containsNull = true) 
|-- HashedNGrams: vector (nullable = true) 

HashedNGrams 2^31の疎ベクトルである:以下私のスキーマです。 HashedNGramsの例は次のとおりですので、いくつかの操作を行うには何でも、ベクタ、一覧[INT]このDATAFRAMEから

70921,235056 
6067499,8758008 
..... , ... 

:私が欲しいもの

[doc/00000.txt,(2147483647,[70921,235056,....],[1.0,2.0,...]) 
[doc/00001.txt,(2147483647,[6067499,8758008,....],[1.0,1.0,...]) 
...... 
...... 

は値だけを取得することですデータ。私はこれまでに試したことは次のとおりです: 1)それを高密度のベクトルに変換しようとしましたが、限界を超えてしまいました。VM例外 2)ここで見つけたすべての可能な解決策を試しました。それらはすべて私に誤りを与える。 3)これをファイルに保存してから、これらの値をStringとして取得しようとしました(これはまだ完了していませんが、非常に間違ったアプローチです)。

助けてください!

+0

あなたの場合、 '70921,235056'は値ではないインデックスです。 – zero323

答えて

0

あなたは、値の配列にSparseVectorを変換し、ユーザー定義関数(UDF)を使用することができます - ここでは、これらのアレイとvaluesという名前の新しい列を追加する方法は次のとおりです。

import org.apache.spark.sql.functions._ 

val valuesOnly = udf { s: SparseVector => s.values } 
val result = df.withColumn("values", valuesOnly(col("HashedNGrams"))) 

UPDATE:述べたように@ zero323で、OPは実際にインデックスの後であり、値ではありません。これは、UDFでs.valuesの代わりにs.indicesを使用することで簡単に実現できます。

+0

ありがとうございました!!! 2つの答え(あなたと@ zero323)の組み合わせによって、私は欲しいものを得ました。私は年齢のためにそれを探していた! 'import org.apache.spark.sql.functions._ val valuesOnly = udf {s:SparseVector => s.indices} val result = df.withColumn(" values "、valuesOnly(col(" HashedNGrams ")) ) ' – Spartan

+0

これは助けてくれたことをうれしく思いました。実際、私はこの例の期待値が実際には指標であったことに気づいていませんでした。他のユーザーがこの質問に回答したことを知らせるために回答をupvote/acceptする場合に役立ちます。 –

+0

私はしました!しかしそれは私に与えます:評判が15未満の人の投票が記録されますが、ポストスコアが表示された公示は変更されません。 – Spartan

関連する問題