Чтение CSV из ADL Gen 1 с ограничением - PullRequest
1 голос
/ 28 мая 2020

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 строк *.

Вопрос

Что-то не так с этим подходом? Или это баг?

1 Ответ

0 голосов
/ 28 мая 2020

Метод limit считывает все данные, а затем создает новый фрейм данных только с указанным количеством строк.

Как вы сказали, то же самое с count и любым другим действием

Метод take может вам подойти, так как он кажется немного быстрее. Но он возвращает Array[Row] вместо Dataframe

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...