繁体   English   中英

在 Palantir Foundry 中,由于无法使用打印语句,我该如何调试 pyspark(或 pandas)UDF?

[英]In Palantir Foundry, how do I debug pyspark (or pandas) UDFs since I can't use print statements?

在代码工作簿中,我可以使用print语句,这些语句出现在代码工作簿的 Output 部分(通常会出现错误)。 这不适用于 UDF,也不适用于代码创作/存储库。

我可以通过哪些方式调试我的 pyspark 代码,尤其是在我使用 UDF 时?

我将解释 pyspark 的 3 个调试工具(可在 Foundry 中使用):

  1. 引发异常
  2. 作为 pandas 系列在本地运行
  3. 记录并专门记录 UDF

引发异常

查看变量(尤其是 pandas UDF)的最简单、最快捷的方法是引发异常

def my_compute_function(my_input):
    interesting_variable = some_function(my_input)  # Want to see result of this
    raise ValueError(interesting_variable)

这通常比读/写 DataFrame 更容易,因为:

  1. 可以很容易地插入一个 raise 语句,而不会弄乱转换的返回值或其他逻辑
  2. 不需要为你的调试语句定义一个有效的模式而乱七八糟

缺点是它会停止代码的执行。

作为 pandas 系列在本地运行

如果您对 Pandas 更有经验,您可以使用少量数据样本,并在驱动程序上运行您的算法作为 pandas 系列,您可以在其中进行调试。

我以前使用的一些技术不仅仅是按行数对数据进行下采样,而是过滤数据以代表我的工作。 例如,如果我正在编写一个算法来确定航班延误,我会过滤到特定日期飞往特定机场的所有航班。 这样我就可以对样本进行整体测试。

记录

代码存储库使用 Python 的内置日志库 这在网上被广泛记录,并允许您控制日志记录级别(错误、警告、信息)以便于过滤。

记录 output 出现在您的 output 数据集的日志文件和构建的驱动程序日志中(数据集 -> 详细信息 -> 文件 -> 日志文件和构建 -> 构建 -> 作业状态日志;select“驱动程序日志”,分别)。

这将允许您在日志中查看记录的信息(在构建完成后),但不适用于 UDF。

登录 UDF

UDF 完成的工作是由执行程序而不是驱动程序完成的,Spark 从顶级驱动程序进程中捕获日志记录 output。 如果您在 PySpark 查询中使用 UDF 并且需要记录数据,请创建并调用第二个 UDF,该 UDF 返回您希望捕获的数据并将其存储在列中以便在构建完成后查看:

@transform_df(
    ...
)
def some_transformation(some_input):
    logger.info("log output related to the overall query")
    
    @F.udf("integer")
    def custom_function(integer_input):
        return integer_input + 5
    
    @F.udf("string")
    def custom_log(integer_input):
        return "Original integer was %d before adding 5" % integer_input
    
    df = (
        some_input
        .withColumn("new_integer", custom_function(F.col("example_integer_col"))
        .withColumn("debugging", custom_log(F.col("example_integer_col"))
    )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM