Usecase
Приложение My Spark считывает файлы CSV из Azure Data Lake Store Gen.1.
В приложении может быть предусмотрена возможность чтения только первых N строк.
Код
Параметры этого фрагмента:
sc : SparkContext
- с настраиваемой конфигурацией для доступа Azure Магазин Datalake basePath : String
- каталог Azure Datalake в формате adl://xxxx.azuredatalakestore.net/a
structType: StructType
- Пользовательская схема с ок. 20-30 строк, состоящих из базовых c типов данных headOption: Option[Int]
val input = sc.read
.format("csv")
.option("inferSchema", value = false)
.option("header", value = true)
.option("delimiter", "\t")
.option("badRecordsPath", "/tmp/badRecordsPath")
.schema(structType)
.load(basePath + "/b/c/d")
val limited =
if (headOption.isDefined) input.limit(headOption.get)
else input
limited.show(true)
Конечно, show уже обрезает данные, но это следует рассматривать только как заполнитель для будущих действий.
Я подтвердил, что аналогичное поведение наблюдается при использовании других действий, таких как .count()
.
Проблема
Когда определено headOption
, и таким образом, например, используется .limit(5)
, время выполнения увеличивается на несколько значений.
В этом случае журналы отладки показывают непрерывные запросы, подобные этому:
com.microsoft.azure.datalake.store.HttpTransport: HTTPRequest,Succeeded,cReqId:xxxxxx,lat:39,err:,Reqlen:0,Resplen:chunked,token_ns:38300,sReqId:xxxxx,path:/a/b/c/d/xxxxx.txt,qp:op=OPEN&filesessionid=xxxxx&length=4194304&read=true&offset=167772160&api-version=2016-11-01
Каждый запрос имеет возрастающее смещение, что указывает на что весь файл (~ 70 ГБ) медленно загружается.
Если ограничение не используется, журналы отладки показывают только несколько запросов без смещений, что указывает на то, что на самом деле для * 1043 запрашиваются только первые 20 строк *.
Вопрос
Что-то не так с этим подходом? Или это баг?