我有一个运行 PySpark 测试的单元测试(使用 PyTest )。
我有创建 SQLContext 的普通conftest.py
。
我想在所有情况下都得到相同的uuid4,因此我在测试中修补了uuid4。
如果我从测试功能中调用uuid.uuid4()
,那么一切都很好。
但是,当我运行PySpark作业(也称为uuid4)时,未已修补:
我的PySpark功能(简体):
def create_uuid_if_needed(current, prev):
if current > prev:
return str(uuid.uuid4())
else:
return None
def my_df_func(df):
my_udf = udf(create_uuid_if_needed, T.StringType())
my_window = Window.partitionBy(F.col(PARTITIONING_KEY)).orderBy(F.col(ORDER))
return df.withColumn('new_col', my_udf(df.col, F.lag(df.col, 1)).over(my_window))
我的测试如下:
@patch.object(uuid, 'uuid4', return_value='1-1-1-1')
def test_add_activity_period_start_id(mocker, sql_context, input_fixture):
input_df = sql_context.createDataFrame(input_fixture, [... schema...])
good_uuid = str(uuid.uuid4())
another_goood_uuid = create_uuid_if_needed(2, 1)
actual_df = my_df_func(input_df)
...
good_uuid
得到正确的值-'1-1-1-1',another_good_uuid
也得到正确的值,但是该函数的数据帧的udf版本仍然调用未修补的uuid4。>
这是怎么了? udf()
函数正在做什么?
谢谢!