import org.apache.spark.sql.functions._
Используйте функцию substring(column, 0, 1)
вместо функции LEFT
.
где
Пример: Рассмотрим функцию LEFT:
LEFT(upper(SKU),2)
Соответствующий оператор SparkSQL будет выглядеть следующим образом:
substring(upper(SKU),1,2)
Используйте библиотеку unittest.mock
(Python 3.3 и новее, обратные как mock
), чтобы заменить вызовы на любой код, внешний для вашего кода .
Здесь я бы высмеял не только utcnow()
, но и strftime()
, чтобы просто вернуть строковый объект:
with mock.patch('datetime.datetime') as dt_mock:
dt_mock.utcnow.return_value.strftime.return_value = '2016-08-04 12:22:44.123456'
result = DateTimeHelper.get_utc_millisecond_timestamp()
Если вы чувствуете, что тестирование strftime()
, дайте dt_mock.utcnow.return_value
явный объект datetime
для возврата; вам нужно будет создать этот тестовый объект до , который вы издеваетесь, поскольку вы не можете издеваться над методом класса datetime.datetime.utcnow
:
testdt = datetime.datetime(2016, 8, 4, 12, 22, 44, 123456)
with mock.patch('datetime.datetime') as dt_mock:
dt_mock.utcnow.return_value = testdt
result = DateTimeHelper.get_utc_millisecond_timestamp()
или, в своем unittests, используйте from datetime import datetime
, чтобы сохранить ссылку на класс, который не высмеивается.
Демо:
>>> from unittest import mock
>>> import datetime
>>> class DateTimeHelper(object):
... @staticmethod
... def get_utc_millisecond_timestamp():
... (dt, micro) = datetime.datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f').split('.')
... return "%s.%03d" % (dt, int(micro) / 1000) # UTC time with millisecond
...
>>> with mock.patch('datetime.datetime') as dt_mock:
... dt_mock.utcnow.return_value.strftime.return_value = '2016-08-04 12:22:44.123456'
... result = DateTimeHelper.get_utc_millisecond_timestamp()
...
>>> result
'2016-08-04 12:22:44.123'
>>> testdt = datetime.datetime(2016, 8, 4, 12, 22, 44, 123456)
>>> with mock.patch('datetime.datetime') as dt_mock:
... dt_mock.utcnow.return_value = testdt
... result = DateTimeHelper.get_utc_millisecond_timestamp()
...
>>> result
'2016-08-04 12:22:44.123'
freezegun
производит сложные издевки; Я до сих пор не видел какого-либо прецедента, когда вы не могли достичь того же сmock
. Еслиmock
является стандартом defacto, я не уверен, что когда-нибудь выберетfreezegun
. – Martijn Pieters♦ 31 August 2016 в 14:51urllib
, что я не мог сrequests
... это в основном удобство - вот и все. – Jon Clements♦ 31 August 2016 в 14:55urllib
иrequests
. Иmock
позволяет мне подробно проверить, как меня называли мои издевательства, что-тоfreezegun
не позволяет мне это делать. – Martijn Pieters♦ 31 August 2016 в 14:56