web-dev-qa-db-ja.com

RDDの内容を印刷する方法

コレクションの内容を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をコンソールに書き込んだり、ディスクに保存して内容を表示したりするにはどうすればよいですか。

112
blue-sky

RDDの内容を表示したい場合は、collect()を使用するのが1つの方法です。

myRDD.collect().foreach(println)

ただし、RDDに何十億もの行がある場合、それはお勧めできません。印刷するのにほんの数分かかるには、take()を使用してください。

myRDD.take(n).foreach(println)
212
Oussama

map関数は 変換 です。つまり、Sparkは実行するまで実際にRDDを評価しません。それに対する アクション

印刷するには、foreach(これはアクションです)を使用できます。

linesWithSessionId.foreach(println)

これをディスクに書き込むには、 RDD APIからのsaveAs...関数(まだアクション)を使用できます

46
fedragon

これをクラスタ上で実行している場合、printlnはあなたのコンテキストに出力しません。あなたはRDDデータをあなたのセッションに持ってくる必要があります。これを行うには、ローカル配列にそれを強制してからそれを印刷することができます:

linesWithSessionId.toArray().foreach(line => println(line))
12
Noah

RDDDataFrameに変換してから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|
+------+---+
10
Wesam

Pythonで

   linesWithSessionIdCollect = linesWithSessionId.collect()
   linesWithSessionIdCollect

これはRDDのすべての内容を表示します

1

myRDD.foreach(println)myRDD.collect().foreach(println)の間には、おそらく多くのアーキテクチャ上の違いがあります( 'collect'だけでなく他のアクションも)。私がmyRDD.foreach(println)を実行したときに私が見た違いの1つは、出力はランダムな順序になるでしょう。例:私のrddが各行に番号を持っているテキストファイルから来ているならば、出力は異なる順序を持つでしょう。しかし、myRDD.collect().foreach(println)を実行したとき、順序はテキストファイルとまったく同じです。

1
Karan Gupta

毎回入力する代わりに、できます。

[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

重要

これは、ローカルモードで少量のデータセットを使用している場合にのみ意味があります。そうしないと、データセットの結果が大きいために、クライアントで結果を表示できないか、メモリが不足することになります。

1
noego

ファイルとして保存することもできます。rdd.saveAsTextFile("alicia.txt")

0
Thomas Decaux
c.take(10)

そしてSparkの新しいバージョンはきれいに表を表示します。

0
Harvey