2016-12-30 6 views
4

下のスパークジョブの出力からかっこ "("と ")"を削除するにはどうすればよいですか?RDDの[(String、Int)]でsaveAsTextFileを実行したときに、レコードの前後に括弧を削除するにはどうすればよいですか?

PigScriptを使用してスパーク出力を読み込もうとすると、問題が発生します。

私のコード:コード上記のとおり

scala> val words = Array("HI","HOW","ARE") 
words: Array[String] = Array(HI, HOW, ARE) 

scala> val wordsRDD = sc.parallelize(words) 
wordsRDD: org.apache.spark.rdd.RDD[String] = ParallelCollectionRDD[0] at parallelize at <console>:23 

scala> val keyvalueRDD = wordsRDD.map(elem => (elem,1)) 
keyvalueRDD: org.apache.spark.rdd.RDD[(String, Int)] = MapPartitionsRDD[1] at map at <console>:25 

scala> val wordcountRDD = keyvalueRDD.reduceByKey((x,y) => x+y) 
wordcountRDD: org.apache.spark.rdd.RDD[(String, Int)] = ShuffledRDD[2] at reduceByKey at <console>:27 

scala> wordcountRDD.saveAsTextFile("/user/cloudera/outputfiles") 

出力:

hadoop dfs -cat /user/cloudera/outputfiles/part* 

(HOW,1) 
(ARE,1) 
(HI,1) 

しかし、私は、スパークの出力は括弧なしとして、次のように格納したい

HOW,1 
ARE,1 
HI,1 

今、私はPigScriptを使って上記の出力を読みたいと思います。私は適用しないように、第2の原子として

がとにかくあります「(第一原子と」1として、我々はスパークコード自体の中に括弧をオフに取り除くことができますどのように「)」Pigscript扱いで

LOAD文pigscriptで、このために修正..

豚スクリプト:

records = LOAD '/user/cloudera/outputfiles' USING PigStorage(',') AS (word:chararray); 
dump records; 

豚出力:

((HOW) 
((ARE) 
((HI) 

答えて

2

使用map変換を使用すると、例えば、outputfilesディレクトリにレコードを保存する前に、

wordcountRDD.map { case (k, v) => s"$k, $v" }.saveAsTextFile("/user/cloudera/outputfiles") 

Spark's documentation about mapを参照してください。


データセットを使用することを強くお勧めします。

scala> words.toSeq.toDS.groupBy("value").count().show 
+-----+-----+ 
|value|count| 
+-----+-----+ 
| HOW| 1| 
| ARE| 1| 
| HI| 1| 
+-----+-----+ 

scala> words.toSeq.toDS.groupBy("value").count.write.csv("outputfiles") 

$ cat outputfiles/part-00199-aa752576-2f65-481b-b4dd-813262abb6c2-c000.csv 
HI,1 

Spark SQL, DataFrames and Datasets Guideを参照してください。

1

この形式はタプルの形式です。あなた手動で書式を定義することができます。

val wordcountRDD = keyvalueRDD.reduceByKey((x,y) => x+y) 
           // here we set custom format 
           .map(x => x._1 + "," + x._2) 
wordcountRDD.saveAsTextFile("/user/cloudera/outputfiles") 
関連する問題