簡體   English   中英

如何模擬對 pyspark sql function 的內部調用

[英]How to mock inner call to pyspark sql function

得到以下 pyspark 代碼:

import pyspark.sql.functions as F

null_or_unknown_count = df.sample(0.01).filter(
    F.col('env').isNull() | (F.col('env') == 'Unknown')
).count()

在測試代碼中,數據框被模擬,所以我試圖為這個調用設置 return_value,如下所示:

from unittest import mock
from unittest.mock import ANY

@mock.patch('pyspark.sql.DataFrame', spec=pyspark.sql.DataFrame)
def test_null_or_unknown_validation(self, mock_df):
    mock_df.sample(0.01).filter(ANY).count.return_value = 250

但這失敗了,原因如下:

File "/usr/local/lib/python3.7/site-packages/pyspark/sql/functions.py", line 44, in _
  jc = getattr(sc._jvm.functions, name)(col._jc if isinstance(col, Column) else col)
AttributeError: 'NoneType' object has no attribute '_jvm'

還嘗試mock_df.sample().filter().count.return_value = 250 ,它給出了同樣的錯誤。

如何模擬過濾器,即F.col('env').isNull() | (F.col('env') == 'Unknown') F.col('env').isNull() | (F.col('env') == 'Unknown')正確嗎?

感謝我工作中的聰明同事,這就是答案。 我們必須模擬pyspark.sql.functions.col然后設置一個 return_value。

@mock.patch('pyspark.sql.functions.col')
@mock.patch('pyspark.sql.DataFrame', spec=pyspark.sql.DataFrame)
def test_null_or_unknown_validation(self, mock_df, mock_functions):
    mock_functions.isNull.return_value = True # (or False also works)
    mock_df.sample(0.01).filter(ANY).count.return_value = 250

使用mock_df.sample().filter().count.return_value = 250也可以正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM