Как генерировать динамические файлы с помощью файла конфигурации в palantir foundry

#palantir-foundry #foundry-code-repositories #foundry-code-workbooks

#palantir-foundry #foundry-code-репозитории #foundry-code-workbooks

Вопрос:

У меня есть два столбца в файле конфигурации col1 и col2.

введите описание изображения здесь

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

Например, ouput_path1=константа значение1 значение2

ouput_path2=Константа значение3 значение4

Пожалуйста, предложите какое-либо решение для генерации выходного файла в palantir foundary (code-repo)

Ответ №1:

То, что вы, вероятно, захотите использовать, — это генератор преобразований. В главе документации «Преобразования Python» есть раздел «Генерация преобразований», в котором излагаются основы этого.

Самый простой путь, вероятно, приведет к созданию нескольких преобразований, но если вам нужно только одно преобразование, которое выводит несколько наборов данных, это тоже возможно (если немного сложнее).

Для первого подхода вы должны добавить файл .yaml (или аналогичный) в свой репозиторий, в котором вы определяете свои значения, а затем вы читаете .файл yaml и генерировать несколько преобразований на основе значений. В документации приведен пример, который делает практически именно это.

Для последнего подхода вы, вероятно, захотите прочитать .файл yaml в вашем определителе конвейера, а затем динамически добавлять выходные данные в одно преобразование. Затем в вашем коде преобразования вам нужно каким-то образом обрабатывать произвольное количество выходных данных (я полагаю, у вас есть план).) Я подозреваю, что для этого вам может потребоваться вернуться к ручной регистрации преобразования, или вам может потребоваться создать объект transformes без использования декоратора. Если это решение, которое вам нужно, я могу построить для вас пример.

Однако, прежде чем вы продолжите, я хочу отметить, что количество входов и выходов фиксировано в «CI-time» или «время компиляции». Когда вы нажимаете кнопку «фиксация» при разработке (или объединяете PR), именно в этот момент запускается код, который генерирует преобразования / выходы. Позже, когда вы создаете фактический набор данных (т. Е. Запускаете преобразования), Добавление / удаление входных данных, выходных данных и преобразований больше невозможно.

Итак, чтобы изменить количество входов / выходов / преобразований, вам нужно будет перейти в репозиторий, изменить .файл yaml (или любой другой, который вы выбрали для использования), а затем нажмите кнопку фиксации. Это приведет к запуску проверок CI и публикации нового кода, включая любые новые преобразования, которые могли быть сгенерированы в процессе.

Если это вам не подходит (т. Е. Вы хотите решить во время сборки набора данных, какие выходные данные генерировать), вам придется в корне пересмотреть свой подход. В противном случае вам подойдет одно из двух решений, которые я примерно изложил выше.

Ответ №2:

Вы не можете программно создавать преобразования на основе содержимого других наборов данных. Наборы данных создаются во время CI.

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

 myconfig.py:
dataset_pairs = [
  {
    "in": "/path/to/input/dataset,
    "out": "/path/to/output/dataset,
  },
  {
    "in": "/path/to/input/dataset2,
    "out": "/path/to/output/dataset2,
  },
  # ...
  {
    "in": "/path/to/input/datasetN,
    "out": "/path/to/output/datasetN,
  },

]

///////////////////////////
anotherfile.py
from myconfig import dataset_pairs

TRANSFORMS = []
for conf in dataset_pairs:
  @transform_df(Output(conf["out"]), my_input=Input(conf["in"]))
  def my_generated_transform(my_input)
     # ...
     return df

  TRANSFORMS.append(my_generated_transform)
  

Для повторной итерации вы не можете создать config.py программно на основе содержимого набора данных, потому что, когда этот код выполняется, он выполняется во время CI, поэтому у него нет доступа к наборам данных.