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调试器:
- 在存放函数的Notebook里,在报错行(第58行)之前设置断点
- 运行调用Notebook时启动调试模式
- 触发断点后,查看当前上下文的所有参数值,逐行排查问题
内容的提问来源于stack exchange,提问作者solarissf
相关产品推荐
相关产品推荐

