Dynami c имя выходного файла в потоках данных в Azure Фабрика данных приводит к папкам вместо файлов - PullRequest
0 голосов
/ 02 апреля 2020

Я устанавливаю поток данных в ADF, который принимает Azure Набор данных таблицы в качестве источника, добавляет производный столбец, который добавляет столбец с именем «имя файла» и значение Dynami c, основанное на поле данных из исходной схемы.

Затем выходные данные отправляются в приемник, связанный с набором данных, который подключен к хранилищу BLOB-объектов (пробовал ADLS Gen2 и стандартное хранилище BLOB-объектов).

Однако после выполняя конвейер, вместо того, чтобы найти несколько файлов в моем контейнере, я вижу, что есть папки, созданные с именем filename=ABC123.csv, которые сами по себе содержат другие файлы (это заставляет меня думать о файлах паркета):

- filename=ABC123.csv
  + _started_UNIQUEID
  + part-00000-tid-UNIQUEID-guids.c000.csv

Итак, я явно что-то упускаю, так как мне нужно, чтобы в контейнере набора данных были указаны отдельные файлы с именем, которое я указал в конвейере.

Вот так выглядит конвейер: Screenshot

Вкладка «Оптимизировать» формы «Раковина» выглядит следующим образом: enter image description here

Здесь вы можете увидеть настройки формы «Раковина»: * 102 2 *

И это код конвейера (однако некоторые части отредактированы):

source(output(
        PartitionKey as string,
        RowKey as string,
        Timestamp as string,
        DeviceId as string,
        SensorValue as double
    ),
    allowSchemaDrift: true,
    validateSchema: false,
    inferDriftedColumnTypes: true) ~> devicetable
devicetable derive(filename = Isin + '.csv') ~> setoutputfilename
setoutputfilename sink(allowSchemaDrift: true,
    validateSchema: false,
    rowUrlColumn:'filename',
    mapColumn(
        RowKey,
        Timestamp,
        DeviceId,
        SensorValue
    ),
    skipDuplicateMapInputs: true,
    skipDuplicateMapOutputs: true) ~> distributetofiles

Есть предложения или советы? (Я довольно новичок в ADF, так что терпите меня)

Ответы [ 2 ]

0 голосов
/ 03 апреля 2020

Вы видите файлы-призраки, оставленные процессом Spark в пути к папке набора данных. Когда вы используете «Как данные в столбце», ADF запишет файл, используя значение вашего поля, начиная с контейнера root.

. Вы увидите это в свойстве «Столбец с именем файла»:

enter image description here

Итак, если вы перейдете к контейнеру хранения root, вы должны увидеть файл ABC123.csv.

Теперь, если вы хотите поместить этот файл в папку, просто добавьте имя этой папки в формулу преобразования производного столбца примерно так:

"output / folder1 / {Isin} .csv"

двойные кавычки активируют интерполяцию строки ADF. Таким образом, вы можете комбинировать буквенный текст с формулами.

0 голосов
/ 02 апреля 2020

Недавно я пробовал нечто похожее на ваш сценарий (но не совсем то же самое). Здесь много вариантов и движущихся частей, поэтому этот пост не является исчерпывающим. Надеюсь, что-то в этом поможет вам найти решение, к которому вы стремитесь.

Шаг 1. Разделение источника В потоке данных вы можете группировать похожие строки вместе с помощью Set Partitioning. Один из многих вариантов - по ключу (столбец в источнике): enter image description here

В этом примере у нас 51 штат США (50 штатов + D C), и так получится 51 раздел.

Шаг 2: Настройки приемника Как вы выяснили, опция «Как данные в столбце» приводит к структурированному имени папки, например {columnName} = {columnValue}. Мне сказали, что это потому, что это стандарт в средах типа Hadoop / Spark. Внутри этой папки будет набор файлов, как правило, с именами, не основанными на использовании GUID.

«По умолчанию» даст тот же результат, что и в настоящее время, без имени папки на основе столбцов. Вывод в один файл "не требует пояснений, и это самая далекая вещь из того решения, к которому вы стремитесь. Если вы хотите контролировать окончательные имена файлов, лучший вариант, который я нашел, - это вариант" Шаблон ". Это сгенерирует файл ( s) с указанным именем и номером переменной [n]. Честно говоря, я не знаю, что сгенерирует раздел, но он может приблизить к вам результаты, к которым вы стремитесь, 1 файл на значение столбца .

enter image description here

Некоторые предостережения:

  • Имя папки определено в наборе данных приемника, а НЕ в потоке данных. Параметры набора данных действительно, вероятно, «Шаг 0.» Для вывода типа Blob вы, вероятно, можете жестко закодировать имя папки, например «myfolder / fileName- [n]». YMMV.
  • К сожалению, ни один из этих параметров не разрешит использовать производный столбец для генерации имени файла. [Если вы откроете редактор выражений, вы обнаружите, что «Входящая схема» не заполнена.]

Шаг 3: Раковина Оптимизировать Последний Часть, с которой вы можете поэкспериментировать - это Sink Partitioning на вкладке Optimize: enter image description here

«Использовать текущее разбиение» сгруппирует результаты на основе раздела, установленного в исходной конфигурации. «Один раздел» сгруппирует все результаты в одну группу вывода (почти наверняка НЕ ​​то, что вы хотите). «Установить разделение» позволит вам перегруппировать данные Sink на основе столбца Key. В отличие от настроек Sink, это позволит вам получить доступ к производному имени столбца, но я предполагаю, что вы столкнетесь с той же проблемой именования папок, что и сейчас.

На данный момент это все, что я знаю , Я считаю, что есть комбинация этих опций, которая даст то, что вы хотите, или что-то близкое к этому. Возможно, вам придется подойти к этому в несколько этапов, таких как вывод этого потока в папки с неправильными именами в промежуточное местоположение, а затем создание другого конвейера / потока, который обрабатывает каждую папку и сворачивает результаты в нужное имя.

...