コレクションの内容をSparkコンソールに出力しようとしています。
私はタイプがあります:
linesWithSessionId: org.Apache.spark.rdd.RDD[String] = FilteredRDD[3]
そして私はコマンドを使用します:
scala> linesWithSessionId.map(line => println(line))
しかし、これは印刷されています:
res1:org.Apache.spark.rdd.RDD [単位] = MappedRDD [4] at map at:19
RDDをコンソールに書き込んだり、ディスクに保存して内容を表示したりするにはどうすればよいですか。
RDDの内容を表示したい場合は、collect()
を使用するのが1つの方法です。
myRDD.collect().foreach(println)
ただし、RDDに何十億もの行がある場合、それはお勧めできません。印刷するのにほんの数分かかるには、take()
を使用してください。
myRDD.take(n).foreach(println)
map
関数は 変換 です。つまり、Sparkは実行するまで実際にRDDを評価しません。それに対する アクション 。
印刷するには、foreach
(これはアクションです)を使用できます。
linesWithSessionId.foreach(println)
これをディスクに書き込むには、 RDD APIからのsaveAs...
関数(まだアクション)を使用できます
これをクラスタ上で実行している場合、println
はあなたのコンテキストに出力しません。あなたはRDD
データをあなたのセッションに持ってくる必要があります。これを行うには、ローカル配列にそれを強制してからそれを印刷することができます:
linesWithSessionId.toArray().foreach(line => println(line))
RDD
をDataFrame
に変換してからshow()
に変換できます。
// For implicit conversion from RDD to DataFrame
import spark.implicits._
fruits = sc.parallelize([("Apple", 1), ("banana", 2), ("orange", 17)])
// convert to DF then show it
fruits.toDF().show()
これにより、データの上位20行が表示されるので、データのサイズは問題になりません。
+------+---+
| _1| _2|
+------+---+
| Apple| 1|
|banana| 2|
|orange| 17|
+------+---+
Pythonで
linesWithSessionIdCollect = linesWithSessionId.collect()
linesWithSessionIdCollect
これはRDDのすべての内容を表示します
myRDD.foreach(println)
とmyRDD.collect().foreach(println)
の間には、おそらく多くのアーキテクチャ上の違いがあります( 'collect'だけでなく他のアクションも)。私がmyRDD.foreach(println)
を実行したときに私が見た違いの1つは、出力はランダムな順序になるでしょう。例:私のrddが各行に番号を持っているテキストファイルから来ているならば、出力は異なる順序を持つでしょう。しかし、myRDD.collect().foreach(println)
を実行したとき、順序はテキストファイルとまったく同じです。
毎回入力する代わりに、できます。
[1] Spark Shell内で一般的な印刷メソッドを作成します。
def p(rdd: org.Apache.spark.rdd.RDD[_]) = rdd.foreach(println)
[2]あるいはもっと良いことに、暗黙のうちに、その内容を印刷するためにRDDクラスに関数を追加することができます。
implicit class Printer(rdd: org.Apache.spark.rdd.RDD[_]) {
def print = rdd.foreach(println)
}
使用例
val rdd = sc.parallelize(List(1,2,3,4)).map(_*2)
p(rdd) // 1
rdd.print // 2
出力:
2
6
4
8
重要
これは、ローカルモードで少量のデータセットを使用している場合にのみ意味があります。そうしないと、データセットの結果が大きいために、クライアントで結果を表示できないか、メモリが不足することになります。
ファイルとして保存することもできます。rdd.saveAsTextFile("alicia.txt")
c.take(10)
そしてSparkの新しいバージョンはきれいに表を表示します。