{"id":14277,"url":"\/distributions\/14277\/click?bit=1&hash=17ce698c744183890278e5e72fb5473eaa8dd0a28fac1d357bd91d8537b18c22","title":"\u041e\u0446\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u0438\u0442\u0440\u044b \u0431\u0435\u043d\u0437\u0438\u043d\u0430 \u0438\u043b\u0438 \u0437\u043e\u043b\u043e\u0442\u044b\u0435 \u0443\u043a\u0440\u0430\u0448\u0435\u043d\u0438\u044f","buttonText":"\u041a\u0430\u043a?","imageUuid":"771ad34a-9f50-5b0b-bc84-204d36a20025"}

Чтение таблиц Delta Lake непосредственно в Power BI

Microsoft наконец анонсировала коннектор для файлов Parquet в ноябре 2020 года. Формат файлов Parquet разработан фондом Apache как проект с открытым исходным кодом, который стал фундаментальной частью большинства систем Delta Lake в настоящее время.

«Apache Parquet - это столбчатый формат хранения, доступный для любого проекта в экосистеме Hadoop, независимо от выбора структуры обработки данных, модели данных или языка программирования».

Однако Parquet - это всего лишь формат файла, который на самом деле не особо удобен, когда дело доходит до управления данными. Общие операции обработки данных (DML), такие как обновления и удаления, по-прежнему необходимо обрабатывать вручную конвейером данных. Это было одной из причин, по которой Delta Lake (delta.io) была разработана помимо множества других функций, таких как транзакции ACID, правильная обработка метаданных и многое другое.

По сути, таблица Delta Lake - это папка в вашем Data Lake (или в другом месте, где вы храните свои данные) и состоит из двух частей:

  • Файлы журнала дельты (в подпапке _delta_log)
  • Файлы данных (файлы Parquet в корневой папке или подпапках, если используется разделение)

В журнале Delta сохраняются все транзакции, которые изменили данные или метаданные в таблице. Например, если вы выполняете оператор INSERT, новая транзакция создается в журнале Delta, и новый файл добавляется к файлам данных, на которые ссылается журнал Delta. Если выполняется инструкция DELETE, определенный набор файлов данных (логически) удаляется из журнала Delta, но файл данных все еще находится в папке в течение определенного времени. Таким образом, мы не можем просто прочитать все файлы Parquet в корневой папке, но должны сначала обработать журнал Delta, чтобы мы знали, какие файлы Parquet действительны для последнего состояния таблицы.

Эти журналы обычно хранятся в виде файлов JSON (точнее, файлов JSONL). После 10 транзакций создается так называемый файл контрольной точки в формате Parquet, в котором хранятся все транзакции до этого момента времени. Соответствующие журналы для итоговой таблицы представляют собой комбинацию последнего файла контрольной точки и файлов JSON, которые были созданы впоследствии.

Из этих журналов мы получаем информацию и какие файлы Parquet в основной папке необходимо обработать для получения итоговой таблицы. Затем содержимое этих файлов Parquet можно просто объединить и загрузить в Power BI.

Мы инкапсулировали всю эту логику в настраиваемую функцию Power Query, которая принимает на вход список папок с таблицей Delta и возвращает содержимое таблицы Delta. Список папок может поступать из хранилища Delta Lake Azure, локальной папки или хранилища BLOB-объектов Azure. Обязательные поля / столбцы: [Содержание], [Имя] и [Путь к папке]. Существует также необязательный параметр, который позволяет вам указать дополнительные параметры для чтения таблицы Delta, например Version, если вы хотите использовать путешествие во времени. Однако это все еще эксперимент, и если вы хотите получить последнее состояние таблицы, вы можете просто опустить его.

Остается работа с M-кодом для функции:

После того, как вы добавили функцию в среду PowerBI / Power Query, вы можете вызвать ее так:

Кроме того, рекомендуется вложить ваши запросы и разделить доступ к хранилищу (например, Azure Data Lake Store) и чтение таблицы (выполнение функции). Если вы используете для ADLS, обязательно также укажите [HierarchicalNavigation = false]!

Если вы читаете данные из хранилища BLOB-объектов, стандартный список папок немного отличается и его необходимо изменить:

let

Source = AzureStorage.Blobs("https://myadls.blob.core.windows.net/public"),

#"Filtered Rows" = Table.SelectRows(Source, each Text.StartsWith([Name], "data/MyDeltaTable.delta")),

#"Added FullPath" = Table.AddColumn(#"Filtered Rows", "FullPath", each [Folder Path] & "/" & [Name], Text.Type),

#"Removed Columns" = Table.RemoveColumns(#"Added FullPath",{"Name", "Folder Path"}),

#"Split Column by Delimiter" = Table.SplitColumn(#"Removed Columns", "FullPath", Splitter.SplitTextByEachDelimiter({"/"}, QuoteStyle.Csv, true), {"Folder Path", "Name"}),

#"Append Delimiter" = Table.TransformColumns(#"Split Column by Delimiter",{{"Folder Path", (_) => _ & "/", type text}})

in

#"Append Delimiter"

В настоящий момент разъем / функция все еще экспериментальны, и производительность еще не оптимальна. Это исправится в ближайшем будущем, чтобы иметь собственный способ чтения и, наконец, визуализации таблиц Delta Lake в PowerBI.

Актуальные ограничения:

Разделенные таблицы

  • в настоящее время столбцы, используемые для разделения, всегда будут иметь значение NULL
  • значения для разделения столбцов не сохраняются как часть файла, но должны быть получены из пути к папке

Представление

  • в настоящее время не очень хорошо, но это в основном связано с разъемом Parquet, как кажется

Путешествие во времени

  • в настоящее время поддерживает только “VERSION AS OF”
  • нужно добавить “TIMESTAMP AS OF”

Predicate Pushdown / Удаление разделов

  • в настоящее время не поддерживается - всегда читает всю таблицу
0
Комментарии
-3 комментариев
Раскрывать всегда