Я пытаюсь распечатать содержимое коллекции на консоли 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 на консоль или сохранить его на диск, чтобы я мог просматривать его содержимое?
scala
apache-spark
голубое небо
источник
источник
show
метод.Ответы:
Если вы хотите просмотреть содержимое RDD, можно использовать
collect()
:Однако это плохая идея, когда в RDD миллиарды строк. Используйте,
take()
чтобы распечатать всего несколько:источник
saveAsTextFile
RDD, заключается в том, что мне нужно записать содержимое RDD в более чем один файл, поэтому я используюforeach
map
Функция является преобразованием , а это значит , что искра не будет на самом деле оценить вашу RDD , пока вы не запустите действие на него.Чтобы распечатать его, вы можете использовать
foreach
(что является действием):Чтобы записать его на диск, вы можете использовать одну из
saveAs...
функций (статических действий) из RDD API.источник
collect
чтобы RDD можно было распечатать в консоли.foreach
сам сначала «материализует» RDD, а затем запускаетсяprintln
для каждого элемента, так что вcollect
этом нет необходимости (хотя вы, конечно, можете использовать его) ...foreach
работает нормально. Если вы выполняете задание в кластере и хотите распечатать свой rdd, вам следуетcollect
(как указано в других комментариях и ответах), чтобы оно было отправлено драйверу передprintln
выполнением. И использование того,take
что предлагает Усама, может быть хорошей идеей, если ваш RDD слишком велик.Если вы запускаете это в кластере
println
, печать обратно в ваш контекст не выполняется . Вам необходимо перенестиRDD
данные в вашу сессию. Для этого вы можете принудительно поместить его в локальный массив, а затем распечатать:источник
Вы можете преобразовать ваш
RDD
в aDataFrame
thenshow()
it.Это покажет верхние 20 строк ваших данных, поэтому размер ваших данных не должен быть проблемой.
источник
import spark.implicits._
toDF
ниspark.implicits._
в искровой области.Вероятно, существует множество архитектурных различий между
myRDD.foreach(println)
иmyRDD.collect().foreach(println)
(не только «сбор», но и другие действия). Одно из различий, которое я заметил, заключается в том, что при выполненииmyRDD.foreach(println)
вывод будет в случайном порядке. Например: если мой rdd поступает из текстового файла, в котором каждая строка имеет номер, вывод будет иметь другой порядок. Но когда я это сделалmyRDD.collect().foreach(println)
, порядок остается таким же, как и в текстовом файле.источник
В питоне
Будет распечатано все содержимое СДР.
источник
и более новая версия Spark будет хорошо отображать таблицу.
источник
Вместо того, чтобы печатать каждый раз, вы можете;
[1] Создайте общий метод печати внутри Spark Shell.
[2] Или, что еще лучше, используя неявные выражения, вы можете добавить функцию в класс RDD, чтобы распечатать его содержимое.
Пример использования:
Вывод:
Важный
Это имеет смысл только в том случае, если вы работаете в локальном режиме и с небольшим набором данных. В противном случае вы либо не сможете увидеть результаты на клиенте, либо закончится память из-за большого набора данных.
источник
Вы также можете сохранить как файл:
rdd.saveAsTextFile("alicia.txt")
источник
В синтаксисе java:
источник