#apache-spark #apache-zeppelin
#apache-spark #apache-zeppelin
Вопрос:
Является ли spark.read.text действием Spark или преобразованием?
Я понимаю, что это преобразование. Но тогда почему в моем блокноте Zeppelin это занимает 3 минуты 25 секунд?
val dump = spark.read.text(s"s3://redacted/*/*").as[String].filter(_.nonEmpty)
В этом конвейере нет действий, только преобразования. Эта ячейка моей записной книжки Apache Zeppelin должна выполняться мгновенно. Это потому, что он перечисляет все файлы в моей корзине S3?
Для контекста: версия Spark = 3.0.0-amzn-0, версия Zeppelin 0.9.0-предварительный просмотр1.
Ответ №1:
Это не является ни действием, ни преобразованием.
Spark использует «ленивую» оценку, и поэтому чтение не может быть похоже на «сохранить», действие. фильтр — это преобразование.
Spark также с Catalyst (DFs и т.д.) запускает некоторую подводную оптимизацию в определенных случаях.
Я побежал, чтобы обновить некоторый код в расположениях Databricks S3. Имейте в виду, что есть проблемы со скоростью для S3, и это не posix-подобная файловая система с быстрым поиском местоположений.
Это val dump = spark.read.text("/mnt/training/*.csv")
выполняется в один миг, и задание не инициируется.
Это val dump = spark.read.text("/mnt/training/")
генерирует задание со следующим описанием:
Listing leaf files and directories for 58 paths:
dbfs:/mnt/training/301, ...
Этот последний похож на ваш …/* /*.
Поскольку S3 работает медленно, что-то запускается, чтобы найти уже указанные вами местоположения файлов (которые вы указали), чтобы компенсировать медлительность, и поскольку вы находитесь в синхронном режиме, вам нужно подождать.
Проза в Интернете о действии и преобразовании в целом основана на RDDs, но с внедрением DFs и DSs ситуация изменилась.
Тем не менее чтение не может рассматриваться как действие, и я уверен, что фильтр еще не применен. Я не вижу входящих и исходящих байтов в пользовательском интерфейсе Spark.
Комментарии:
1. Это не кажется «ленивым», поскольку выполнение этой строки занимает более 3 минут. Похоже, что Spark фактически считывает все файлы S3 в моем ведре. Что странно, потому что я ожидаю, что он будет читать файлы только тогда, когда какое-то действие выполняется по строке.