はじめに
PySparkを使用してデータ集計した結果をMySQLにinsertするコードの一部を改修後、テストパターンを追加して動かしたのですが、テストが通らず、原因を突き止めるのに苦戦したので備忘メモとして残します。
やりたかったこと
PySparkを使用してデータ集計した結果をMySQLにinsertするコードのテストコードを実装したい
結論
原因は時刻の不一致で、時刻がUNIXタイムスタンプで表示されていた。
動作環境
pyspark==3.3.0
numpy==1.21.3
pandas==1.3.5
PyYAML==6.0.1
PyMySQL==1.0.2
出力されたエラー
データ集計した結果をMySQLにinsertするコードの一部を改修後、テストパターンを追加して動かしたのですが、以下のようにAssertionErrorが出力されました。
以下の出力エラーとinput、expectedはサンプルです。
AssertionError: numpy array are different
numpy array values are different (33.33333 %)
[index]: [0, 1, 2]
[left]: [1712016000000000000, 1712016000000000000, 1712016000000000000]
[right]: [1712016000000000000, 1712016000000000000, 1712019600000000000]
input.yml
- update_time: 2024-04-02 00:00:00
id: 10000
sub_id: 11
flg: 1
- update_time: 2024-04-02 00:00:00
id: 20000
sub_id: 22
flg: 1
- update_time: 2024-04-02 00:00:00
id: 30000
sub_id: 33
flg: 0
- update_time: 2024-04-02 00:00:00
id: 40000
sub_id: 44
flg: 0
- update_time: 2024-04-02 01:00:00
id: 50000
sub_id: 55
flg: 1
expected.yml(flgが1のデータを返す想定)
- update_time: 2024-04-02 00:00:00
id: 10000
sub_id: 11
- update_time: 2024-04-02 00:00:00
id: 20000
sub_id: 22
- update_time: 2024-04-02 01:00:00
id: 50000
sub_id: 55
解決方法
AssertionErrorとは、Pythonのunittestモジュールでテストを実行する際に、assert文がFalseを返した場合に出力されるエラーです。
AssertionError自体はよく見るので、想定した実行結果と動かした結果に整合性が無いことが問題なのだなと思いました。
また、その後のindexを見るとindex[2]の値が1712016000000000000
と1712019600000000000
で一致していないことが分かりました。
通常であれば、assertionで比較した第一引数(left)と第二引数(right)の値が出力されて差分がすぐわかるのですが、今回は設定していない数値が表示されていたため、混乱しつつもid:50000の値のymlファイル双方をよく見直しました。
その結果、想定した実行結果のymlファイルの時刻が'2024-04-02 00:00:00'と'2024-04-02 01:00:00'で一致していませんでした。
時刻を修正したところ無事通りました。
日付の値の位置にある数値は何なのか
では、日付の位置にある数値が何なのかについてなのですが、この数値はUNIXタイムスタンプの値でした。
なので、変換ツールを使用してみたところ1712019600000000000
= '2024-04-02 01:00:00'であることが分かりました。
最後に
同じようにAssertionErrorで設定したはずのない数値が表示された方の参考になれば幸いです。
なぜ時刻がUNIXタイムスタンプで表示されてしまうのかという点については調査できていないので、原因が分かり次第追記したいと思います。
参考