1

サンプル データセット:

$, Claw         "OnCreativity" (2012)  [Himself]

$, Homo         Nykytaiteen museo (1986)  [Himself]  <25>
            Suuri illusioni (1985)  [Guests]  <22>

$, Steve        E.R. Sluts (2003) (V)  <12>

$hort, Too      2012 AVN Awards Show (2012) (TV)  [Himself - Musical Guest]
            2012 AVN Red Carpet Show (2012) (TV)  [Himself]
            5th Annual VH1 Hip Hop Honors (2008) (TV)  [Himself]
            American Pimp (1999)  [Too $hort]

次のコードを使用して、キーと値のペアの RDD を作成しました。

To split data: val actorTuple = actor.map(l => l.split("\t"))
 To make KV pair: val actorKV = actorTuple.map(l => (l(0), l(l.length-1))).filter{case(x,y) => y != "" }

コンソールでの Key-Value RDD 出力:

Array(($, Claw,"OnCreativity" (2012)  [Himself]), ($, Homo,Nykytaiteen museo (1986)  [Himself]  <25>), ("",Suuri illusioni (1985)  [Guests]  <22>), ($, Steve,E.R. Sluts (2003) (V)  <12>).......

しかし、データセットの性質上、多くの行でこの "" がキー、つまり空白になっています (上記の RDD 出力を参照)。空の。これを行う方法。

4

2 に答える 2

1

Spark と Scala の新機能。しかし、おそらく、行の解析を変更し、最初にリスト型の値を持つペア RDD を作成する方が簡単でしょう。

($, Homo, (Nykytaiteen museo (1986) [本人] <25>, Suurilusioni (1985) [ゲスト] <22>) )

あなたのデータはわかりませんが、おそらく行が「$」で始まらない場合は、値リストに追加します。

次に、何をしたいかによっては、おそらく上記のペア RDD で flatMapValues(func) を使用できます。これは、ペア RDD の各値にイテレータを返す関数を適用し、返された各要素に対して、古いキーを使用してキーと値のエントリを生成します。

追加: 入力データ (「サンプル データセット」) の形式は何ですか? テキストファイルですか、それとも .tsv ですか? おそらく、ファイル全体を一度にロードしたいでしょう。つまり、.textFile() ではなく .wholeTextFiles() を使用してデータをロードします。これは、レコードがファイル内の複数の行にまたがって保存されているためです。

追加 ファイルをダウンロードするつもりはありませんが、関心のある各レコードは「$」で始まるようです。Spark はどの Hadoop 入力形式でも動作するので、それらをチェックして、サンプル データで動作するものがあるかどうかを確認してください。

そうでない場合は、「\n」文字である TextFiles のデフォルトの代わりに、ファイルをこの文字で分割されたレコードに解析する独自の Hadoop InputFormat 実装を作成できます。

于 2014-11-12T20:48:49.610 に答える
1

xyzzy が提供したアイデアから続けて、ファイルに文字列としてロードした後、これを試してみてはどうでしょうか。

val actorFileSplit = actorsFile.split("\n\n")
val actorData = sc.parallelize(actorsFileSplit)
val actorDataSplit = actorsData.map(x => x.split("\t+",2).toList).map(line => (line(0), line(1).split("\n\t+").toList))

私が何をしているのかを説明するために、改行を見つけるたびに文字列を分割することから始めます。これを連続して、関数をマッピングするための sparkcontext に並列化します。次に、すべてのエントリを 2 つの部分に分割し、最初に出現する複数のタブ (1 つ以上) で区切られます。最初の部分は俳優で、2 番目の部分は引き続き映画のタイトルの文字列です。2 番目の部分は、新しい行ごとに再び分割され、その後にいくつかのタブが続きます。これにより、すべての俳優のすべてのタイトルを含むリストが作成されます。最終結果は次の形式になります。

actorDataSplit = [(String, [String])]

幸運を

于 2014-11-18T07:08:09.830 に答える