databricks - 如何在调用函数时调试参数

问题描述 投票:0回答:1

在 databricks 中,我有 2 个笔记本。一台笔记本拥有一项功能。另一个笔记本调用第一个笔记本中的函数。

这就是我调用该函数的方式

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')
    )

我收到一个很长的错误,但最重要的是它说明了函数中第 58 行的内容。

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

线路是

if len(BBSymbol) == 1:

我认为对于这种特殊情况,BBsymbol 为空或 NULL

有没有一种方法可以运行某种调试器,向我显示输入到函数中的所有值?每行数据有十个参数。

这就是我在第一个笔记本中创建函数的方式

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")    
python tags databricks
1个回答
0
投票

UDF 是在工作人员上运行的,因此放置

print()
不会有太大帮助。调试最简单的方法就是从函数中以列的形式返回调试消息。例如

>>> import pyspark.sql.functions as F
>>> from pyspark.sql.types import *
>>> df = spark.createDataFrame(data=[(1, 2), (11, 22)], schema=['a', 'b'] )
>>> df.show(truncate=False)
+---+---+
|a  |b  |
+---+---+
|1  |2  |
|11 |22 |
+---+---+

>>> 
>>> @F.udf(returnType=StructType([StructField('val', IntegerType()), StructField('log', StringType())]))
... def my_func(a, b):
...   return a * b, f'got a: {a}, b: {b}. Returning: {a * b}'
... 
>>> 
>>> df.withColumn('c', my_func('a', 'b')).show(truncate=False)
+---+---+---------------------------------------+
|a  |b  |c                                      |
+---+---+---------------------------------------+
|1  |2  |{2, got a: 1, b: 2. Returning: 2}      |
|11 |22 |{242, got a: 11, b: 22. Returning: 242}|
+---+---+---------------------------------------+
>>> 
>>> df.withColumn('c', my_func('a', 'b')).select('a', 'b', 'c.*').show(truncate=False)
+---+---+---+--------------------------------+
|a  |b  |val|log                             |
+---+---+---+--------------------------------+
|1  |2  |2  |got a: 1, b: 2. Returning: 2    |
|11 |22 |242|got a: 11, b: 22. Returning: 242|
+---+---+---+--------------------------------+
>>> 

请注意,从性能角度来看,这在生产代码中是一个坏主意。


还可以查看:pyspark 中带有字典查找的矢量化 pandas udf

© www.soinside.com 2019 - 2024. All rights reserved.