【问题标题】:Palantir Foundry How to allow dynamic number of input in compute (Code repository)Palantir Foundry 如何在计算中允许动态输入数量(代码存储库)
【发布时间】:2022-02-17 01:07:28
【问题描述】:

我有一个文件夹,我每个月都会上传一个文件。该文件将在每个月具有相同的格式。

第一个问题

这个想法是将这个文件夹中的所有文件连接到一个文件中。目前我正在硬编码文件名(文件名 [0]、文件名 [1]、文件名 [2]..),但想象一下我以后会有 50 个文件,我应该明确地将它们添加到 transform_df 装饰器中吗?有没有其他方法可以解决这个问题?

第二个问题:

目前我假设有 4 个文件(2021_07、2021_08、2021_09、2021_10),每当我添加显示 2021_12 数据的文件时,我都希望避免更改代码。 如果我添加input_5 = Input(path_to_2021_12_do_not_exists) ,代码将不会运行并给出错误。

如果没有每月手动向我的代码添加一个新值,我如何为将来的文件实现代码并让代码忽略输入(如果它不存在)?

谢谢

# from pyspark.sql import functions as F
from transforms.api import transform_df, Input, Output
from pyspark.sql.functions import to_date, year, col
from pyspark.sql.types import StringType
from myproject.datasets import utils
from pyspark.sql import DataFrame
from functools import reduce


input_dir = '/Company/Project_name/'
prefix_filename = 'DataInput1_'
suffixes = ['2021_07', '2021_08', '2021_09', '2021_10', '2021_11', '2021_12']

filenames = [input_dir + prefix_filename + suffixe for suffixe in suffixes]


@transform_df(
    Output("/Company/Project_name/Data/clean/File_concat"),
    input_1=Input(filenames[0]),
    input_2=Input(filenames[1]),
    input_3=Input(filenames[2]),
    input_4=Input(filenames[3]),
    )
def compute(input_1, input_2, input_3, input_4):
    input_dfs = [input_1, input_2, input_3, input_4]
    dfs = []

    def transformation_input(df):
        # some transformation
        return df
    for input_df in input_dfs:
        dfs.append(transformation_input(input_df))

    dfs = reduce(DataFrame.unionByName, dfs)
    return dfs

【问题讨论】:

    标签: palantir-foundry foundry-code-repositories


    【解决方案1】:

    这个问题出现了很多,简单的答案是你没有。定义数据集并在其上执行构建是在不同阶段执行的两个不同步骤。

    每当您提交代码并运行检查时,您的整个 Python 代码都会在 renderSchrinkwrap 阶段执行,计算部分除外。这允许 Foundry 发现存在哪些数据集并发布。

    发布涉及创建数据集并将计算函数中的任何内容发布到数据集的作业规范中,因此代工厂知道在您运行构建时要执行什么代码。

    一旦您在数据集上进行构建,Foundry 将只会拾取作业规范中的任何内容并执行它。在您的检查过程中,任何其他代码都已经运行过,并且只运行过一次。

    因此,任何动态输入/输出都需要您对存储库重新运行检查,这意味着必须进行一些代码更改,因为检查是 CI 过程的一部分,而不是构建的一部分。

    【讨论】:

    • 感谢您的详细回答。如果有一个动态的文件名列表呢?首先检查文件是否存在。或者也许检查特定文件夹中当前可用的文件是什么。这样我就可以动态地构造我的filenames
    • 不幸的是,在 CI 时您无法执行这些操作。 CI 无权访问 Foundry 文件系统,因此它只能访问存储库中的任何内容
    • @fmsf 不能将文件上传到文件系统(无模式)数据集,然后在运行时读取(文件路径)并迭代?
    【解决方案2】:

    退一步说,假设您的每个输入文件都具有相同的架构,Foundry 会希望您将所有这些文件在同一个数据集中作为附加事务。

    这可能是不可能的,例如,如果数据“年份”的唯一指示嵌入在文件名中,但您的示例代码将表明您希望所有这些数据集具有相同的架构并且很容易联合起来。

    您可以通过数据集预览手动执行此操作 - 只需使用上传文件按钮或将新文件拖放到预览窗口中 - 或者,如果它是“最终用户”工作流程,则使用文件上传小部件一个车间应用程序。如果此小部件不可用,您可能需要与您的 Foundry 支持团队协调。

    【讨论】:

    • 数据集预览的详细信息选项卡中仍会列出各个源文件,因此它们仍可供参考/下载。
    • 我想过这个解决方案,但问题是我在每个输入文件中都有月-年列。例如,我有接下来的 24 个月(2022 年 1 月到 2023 年 12 月),它可以从一个版本更改为另一个版本。这意味着我需要在附加到数据集之前进行融化转换。在这种情况下,我回到最初的问题:要么为每个数据集进行手动(复制)数据准备,要么手动将文件名添加到 python 代码中。
    • 因此您不必将架构应用于输入数据集 - 您也可以在其中拥有真正的“原始”CSV 或任何其他文件类型。然后,您需要有一个使用 transfrom() 装饰器而不是 ()transform_df 装饰器的初始转换步骤,以便您可以访问代码中的原始文件并执行必要的清理步骤以输出联合数据帧。您可以在以下位置查看您实例上的原始文件访问文档:/workspace/documentation/product/transforms/python-raw-file-access
    猜你喜欢
    • 2021-06-23
    • 2022-07-14
    • 1970-01-01
    • 1970-01-01
    • 2021-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-03
    相关资源
    最近更新 更多