在 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")
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|
+---+---+---+--------------------------------+
>>>
请注意,从性能角度来看,这在生产代码中是一个坏主意。