50

のデータセットがあり(user, product, review)、それを mllib の ALS アルゴリズムにフィードしたいと考えています。

アルゴリズムでは、ユーザーと製品が数字である必要がありますが、私のものは文字列のユーザー名と文字列の SKU です。

現在、個別のユーザーと SKU を取得し、Spark の外部で数値 ID を割り当てています。

これを行うためのより良い方法があるかどうか疑問に思っていました。私が考えた 1 つのアプローチは、基本的に 1 から までを列挙するカスタム RDD を作成nし、2 つの RDD で zip を呼び出すことです。

4

5 に答える 5

45

Spark 1.0以降では、これを簡単に解決するために使用できる 2 つの方法があります。

  • RDD.zipWithIndexのように、連続した ( ) 番号Seq.zipWithIndexを追加します。Longこれは最初に各パーティションの要素をカウントする必要があるため、入力は 2 回評価されます。これを使用する場合は、入力 RDD をキャッシュします。
  • RDD.zipWithUniqueIdも一意のLongID を提供しますが、連続しているとは限りません。(各パーティションに同じ数の要素がある場合にのみ連続します。) 利点は、入力について何も知る必要がないため、二重評価が発生しないことです。
于 2014-07-12T23:27:16.967 に答える
15

同様のユースケースの例として、文字列値をハッシュしました。http://blog.cloudera.com/blog/2014/03/why-apache-spark-is-a-crossover-hit-for-data-scientists/を参照してください。

def nnHash(tag: String) = tag.hashCode & 0x7FFFFF
var tagHashes = postIDTags.map(_._2).distinct.map(tag =>(nnHash(tag),tag))

ハッシュの方が管理しやすいかもしれませんが、すでにこのようなことをしているようです。

Matei はzipWithIndex、RDD をエミュレートするアプローチを提案しました。これは、グローバルに一意になる各パーティション内に ID を割り当てることになります: https://groups.google.com/forum/#!topic/spark-users/WxXvcn2gl1E

于 2014-05-29T20:38:07.050 に答える
2

人々はすでにmonotonically_increasing_id()を推奨しており、Int ではなく Long を作成するという問題に言及しています。

ただし、私の経験では (警告 - Spark 1.6) - 単一のエグゼキューター (前に 1 に再分割) で使用する場合、エグゼキューター プレフィックスは使用されず、番号は Int に安全にキャストできます。明らかに、Integer.MAX_VALUE 行未満にする必要があります。

于 2016-11-29T12:21:49.167 に答える