2016-08-16 12 views
1

RDDにはnameと表示されています。Scala RDD文字列操作

scala> name 
res6: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[24] at map at <console>:37 

私は、各レコードの先頭からname文字を削除し、long形式で残りの数字を返す新しいRDDを作成したいname.foreach(println)

name5000005125651330 
name5000005125651331 
name5000005125651332 
name5000005125651333 

を使用して、それを検査することができます。

望ましい結果:

5000005125651330 
5000005125651331 
5000005125651332 
5000005125651333 

私は次のことを試してみました:

val name_clean = name.filter(_ != "name") 

しかし、これは返します

name5000005125651330 
name5000005125651331 
name5000005125651332 
name5000005125651333 
+0

ような何かを'name.map(_。drop(4).toLong)'はそれを行うべきです(最初の4つの文字を削除するだけです無条件に、彼らはそれが何であるかをチェックしません。 –

+0

Paulに感謝します。私はそれを認識しませんでした。働いた!返信として投稿すること自由に感じてください – LearningSlowly

答えて

4

RDD内の各エントリは文字列です。だから "name"と比較すると、 "name" + some digitsのように常に失敗します。

mapは、RDDで繰り返し処理し、各エントリに新しい値を返します。その新しい値は最初の4文字を含まない文字列で、Longに変換されます。あなたが最初の4つの文字が「名前」になりますわからない場合

すべて一緒に、我々は

name.map(_.drop(4).toLong) 

を得ることを置くと、あなたはそれが最初にチェックすることをお勧めします。何あなたが必要なのは、あなたが最初の4つとして名を持っていない行で何をしたいかに依存しますが、

name.filter(_.startsWith("name")).map(_.drop(4).toLong) 
2

方法stripPrefixような何か文字列から指定された接頭辞を削除(および場合は何もしません文字列は、その接頭辞で始まっていない

をだからあなたはあなたがで必要なものを達成:。。すべての行は、「名前」に等しくないので、もちろん、よく「しかし、これは返す」

val name_clean = name.map(_.stripPrefix("name").toLong) 
+0

OPは確かに分かっていますが、最初の4文字が「名前」でない場合は数字になります。したがって、ファイルに "name"で始まる行だけが含まれている場合、これは機能します(しかし、4文字をドロップするだけでよいかもしれません)。いくつかの行が "name"を開始しない場合、これはおそらくエラーを投げます。 –

+0

真。しかし、コンテキストによっては、間違ったエントリを黙って無視するとランタイムエラーが発生する可能性があります。サイレント無視が必要な場合は、あなたの答えのように '.filter(_。startsWith(" name "))'を挿入することができます。 –

+0

申し訳ありません。いいえ。あなたのコードは、誤った行に数字だけが含まれているかどうかによって例外を与えることがあります。 5月または悪い入力で例外を与えないかもしれないが良いではない –