2016-10-13 5 views
2

私はSpark 2.0を使ってデータセットを分析しています。Spark 2.0でコンマ区切りの文字列から別の項目を取得

A,C 
A,B 
A 
B 
B,C 

私は列に表示されるすべての個別項目とJavaRDDを取得したい、このような何か:これはスパークで効率的に行うことができますどのように

A 
B 
C 

一つの列には、このような文字列データが含まれています? SparkをJavaで使用していますが、Scalaの例やポインタが便利です。

編集: flatMapを使用しようとしましたが、実装が非常に遅いです。

JavaRDD<String> d = dataset.flatMap(s -> Arrays.asList(s.split(",")).iterator()) 

答えて

1

使用してみてください:

1)爆発:https://spark.apache.org/docs/2.0.0/api/java/ org.apache.spark.sql.functions.explode(カラムCOL)

static Column explode(Column e) 

を爆発 - ごとに新しい行を作成し指定された配列またはマップ列の要素

2)この列の "異なる" を実行:

http://spark.apache.org/docs/latest/programming-guide.html

異なる([numTasks]))は、ソースデータセットの別個の要素を含む新しいデータセットを返します。

概要

行ごとに一つの項目(この特定の列)となりますが爆発。

DISTINCTが、私はあなたが「遅い」によって何を意味するかわからないだけで明確なアイテム

2

を残します。おそらくあなたは非常に大きなデータセットを持っています(それ以外の場合はSparkは必要ありません)ので、「遅い」は相対的です。しかし、私は単純に

dataset.flatMap(s -> s.split(",")).distinct 
-1

を行うだろう、私は長い知っているが、あなたは、むしろ労働者よりエグゼキュータ・ノードで完全に行われ、実行したい場合は、これを試してみてください。

dataset 
.flatMap(x => x.split(",")) 
.map(x => (x,1)) 
.sortByKey() 
.reduceByKey(_+_) 
.map(x=>x._1) 

データ・フォーマットでエラーを取得する場合は、これを追加します。あなたの調査結果を知ることが

dataset.map(x=>(x._1+","+x._2+","+x._3)) 

は好奇心が強いです。

関連する問題