У нас есть данные, хранящиеся для таблицы в Azure хранилище BLOB-объектов, которое действует как озеро данных. Данные поступают каждые 30 минут, образуя временные разделы, как показано ниже в UT C
<Container>/<TableName>/y=2020/m=02/d=20/h=01/min=00
<Container>/<TableName>/y=2020/m=02/d=20/h=01/min=30
<Container>/<TableName>/y=2020/m=02/d=20/h=02/min=00 and so on.
Формат файла, используемый для захвата данных, равен или c, а разделы данных во временном разделе имеют одинаковый размер.
У нас есть сценарий использования для сбора данных на уровне дня в IST с использованием Spark (V 2.3) для обработки. Учитывая, что данные находятся в UT C, а вариант использования - для обработки данных в IST (+5,30 UT C), в общей сложности необходимо 48 временных разделов от / h = 18 / min = 30 (предыдущий день) до / ч = 18 / мин = 00 (следующий день). У нас есть два варианта:
Опция 1 Создание фреймов данных для каждого временного раздела и их объединение
df1 = SparkRead(<Container>/<TableName>/y=2020/m=02/d=20/h=18/min=30)
df2 = SparkRead(<Container>/<TableName>/y=2020/m=02/d=20/h=19/min=00)
..
df48 = SparkRead(<Container>/<TableName>/y=2020/m=02/d=21/h=18/min=00) ..
df = df.union(df1)
df = df.union(df2)
..
df = df.union(df48)
В результате для 48 разделов будет получен целый день. данные в формате df.
Вариант 2 Захват данных на уровне дня и применение условия фильтра в течение часа.
df1 = SparkRead(<Container>/<TableName>/y=2020/m=02/d=20/).filter(h>=19 or (h=18 and min=30))
df2 = SparkRead(<Container>/<TableName>/y=2020/m=02/d=21/).filter(h<=17 or (h=18 and min=00))
df = df1.union(df2)
Как только данные загружены в память, время, необходимое для обработки, остается тем же, т. Е. ~ 5 мин. Время, необходимое для загрузки данных, является узким местом. Вариант 1 занимает 30 минут, а вариант 2 - 2 минуты для загрузки в память.
В нескольких блогах мы видели, что Analyzer просматривает весь предыдущий кадр данных каждый раз, когда вызывается union. Таким образом, для 48 союзов он сканирует 1 + 2 + 3 + 47 = 1128 раз. Это причина экспоненциального снижения производительности? Что делает Analyzer, можно ли его отключить? Чтобы сделать функцию чтения обобщенной c для данных с временным разделением в хранилище файлов, есть ли какие-либо предложения или рекомендации для принятия?