You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Databricks中调用函数时如何调试传入的参数?

Databricks UDF调试:查看每行传入的参数值

问题场景

我在Databricks环境下有两个Notebook:一个存放CreateBloombergSymbol函数,另一个用于调用该函数。
调用代码如下:

from pyspark.sql.functions import col
df_adatposUpload = joined_df.select(
      'PATBKG'
      ,varMyBloombergFunction(col('pctym'), col('ExchCode'), col('BBSymbol'), col('BBYellow'), col('OptCode'), col('YearDigits'), col('WeeklyOptions'), col('psubty'), col('pstrik'), col('admmultstrike')).alias('BBSymbol')
)

运行时触发报错,核心错误信息:

PythonException: 'TypeError: object of type 'NoneType' has no len()', from <command-2467610093078830>, line 58

对应函数第58行代码:

if len(BBSymbol) == 1:

我推测是BBSymbol字段为空或NULL导致的,现在需要能查看每行传入该函数的10个参数值的调试方法。

函数定义片段:

def CreateBloombergSymbol(pctym,ExchCode, BBSymbol, BBYellow, OptCode, YearDigits, WeeklyOptions, psubty, pstrik, admmultstrike):
    
    digitMonth = pctym[4:6]
    digitYear1 = pctym[3:4]
    digitYear2 = pctym[2:4]
    
    match_dict = {
        "01": "F",
        "02": "G",
        "03": "H",
        "04": "J",
        "05": "K",
        "06": "M",
        "07": "N",
        "08": "Q",
        "09": "U",
        "10": "V",
        "11": "X",
        "12": "Z",
        "foo": "missingValue"
    }
    charMonth = match_dict.get(digitMonth, "foo")

实用调试方法

方法1:临时修改函数打印参数到日志

在CreateBloombergSymbol函数开头加入打印逻辑,把每行的参数值输出到Databricks日志:

def CreateBloombergSymbol(pctym,ExchCode, BBSymbol, BBYellow, OptCode, YearDigits, WeeklyOptions, psubty, pstrik, admmultstrike):
    # 新增调试打印
    print(f"参数明细:pctym={pctym}, ExchCode={ExchCode}, BBSymbol={BBSymbol}, BBYellow={BBYellow}, OptCode={OptCode}, YearDigits={YearDigits}, WeeklyOptions={WeeklyOptions}, psubty={psubty}, pstrik={pstrik}, admmultstrike={admmultstrike}")
    
    # 原函数逻辑保留
    digitMonth = pctym[4:6]
    # ... 剩余代码不变

重新注册UDF并运行调用代码后,在Databricks的集群日志或Notebook输出日志中就能看到每行的参数内容,重点定位BBSymbol为None的行。

方法2:提前筛选可疑数据直接查看

在调用UDF前,先筛选出BBSymbol为空的行,直接查看原始参数:

# 过滤出BBSymbol为空的行
null_bbsymbol_df = joined_df.filter(col('BBSymbol').isNull() | (col('BBSymbol') == ''))
# 查看所有相关参数
null_bbsymbol_df.select('pctym', 'ExchCode', 'BBSymbol', 'BBYellow', 'OptCode', 'YearDigits', 'WeeklyOptions', 'psubty', 'pstrik', 'admmultstrike').show(100, truncate=False)

这种方法不需要修改函数,直接定位有问题的原始数据。

方法3:给UDF加异常捕获,返回错误+参数

如果是注册为Spark UDF使用,可以包装一层异常处理,出错时返回错误信息和对应参数:

from pyspark.sql.functions import udf
from pyspark.sql.types import StringType

def safe_create_bloomberg_symbol(*args):
    try:
        return CreateBloombergSymbol(*args)
    except Exception as e:
        # 返回错误详情+参数值,方便排查
        return f"ERROR: {str(e)} | 参数列表: {args}"

# 注册安全版UDF
safe_varMyBloombergFunction = udf(safe_create_bloomberg_symbol, StringType())

# 调用时替换为这个安全版UDF
df_adatposUpload = joined_df.select(
    'PATBKG',
    safe_varMyBloombergFunction(col('pctym'), col('ExchCode'), col('BBSymbol'), col('BBYellow'), col('OptCode'), col('YearDigits'), col('WeeklyOptions'), col('psubty'), col('pstrik'), col('admmultstrike')).alias('BBSymbol')
)

# 查看所有出错的行
df_adatposUpload.filter(col('BBSymbol').startswith('ERROR')).show(truncate=False)

出错的行会直接返回错误原因和对应的参数,在DataFrame里就能快速定位问题数据。

方法4:用Databricks自带调试工具(专业版可用)

如果是Databricks专业版,可以使用Notebook调试器:

  1. 在存放函数的Notebook里,在报错行(第58行)之前设置断点
  2. 运行调用Notebook时启动调试模式
  3. 触发断点后,查看当前上下文的所有参数值,逐行排查问题

内容的提问来源于stack exchange,提问作者solarissf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 03:12:35