Как распечатать содержимое RDD?

Я пытаюсь распечатать содержимое коллекции в консоли Spark.

У меня есть тип:

linesWithSessionId: org.apache.spark.rdd.RDD[String] = FilteredRDD[3]

И я использую команду:

scala> linesWithSessionId.map(line => println(line))

Но это напечатано:

res1: org.apache.spark.rdd.RDD [Unit] = MappedRDD [4] на карте по адресу: 19

Как я могу написать RDD для консоли или сохранить его на диск, чтобы я мог просматривать его содержимое?

Ответ 1

Если вы хотите просмотреть содержимое RDD, одним из способов является использование collect():

myRDD.collect().foreach(println)

Это не очень хорошая идея, однако, когда RDD имеет миллиарды строк. Используйте take(), чтобы отобрать только несколько:

myRDD.take(n).foreach(println)

Ответ 2

Функция map - это преобразование, которое означает, что Spark фактически не будет оценивать ваш RDD, пока вы не запустите на нем действие.

Чтобы напечатать его, вы можете использовать foreach (который является действием):

linesWithSessionId.foreach(println)

Для записи на диск вы можете использовать одну из функций saveAs... (все еще действия) из RDD API

Ответ 3

Если вы используете это в кластере, то println не будет возвращаться в ваш контекст. Вам нужно передать данные RDD на ваш сеанс. Для этого вы можете принудительно перенаправить его в локальный массив и затем распечатать его:

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

Ответ 4

Вы можете преобразовать 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|
+------+---+

Ответ 5

Есть, вероятно, много архитектурных различий между myRDD.foreach(println) и myRDD.collect().foreach(println) (а не только "собирать", но и другие действия). Один из различий, который я видел, - это когда myRDD.foreach(println), вывод будет в произвольном порядке. Например: если мой rdd исходит из текстового файла, где каждая строка имеет номер, вывод будет иметь другой порядок. Но когда я сделал myRDD.collect().foreach(println), порядок остался так же, как текстовый файл.

Ответ 6

В python

   linesWithSessionIdCollect = linesWithSessionId.collect()
   linesWithSessionIdCollect

Это приведет к распечатке всего содержимого RDD

Ответ 7

Вместо того, чтобы печатать каждый раз, вы можете;

[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

Важный

Это имеет смысл, только если вы работаете в локальном режиме и с небольшим набором данных. В противном случае вы либо не сможете увидеть результаты на клиенте, либо не хватит памяти из-за большого набора данных.

Ответ 8

Вы также можете сохранить как файл: rdd.saveAsTextFile("alicia.txt")

Ответ 9

c.take(10)

и Spark более новая версия покажет таблицу красиво.