Как распечатать содержимое 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 более новая версия покажет таблицу красиво.