事象
Databricksにてdbutils.fs.rmにより削除したdbfs上のファイルをos.path.existsで確認すると、誤検知しました。下記画像がその際の画面であり、dbutils.fs.lsで確認するとファイルが存在しないにも関わらず、os.path.existsで確認するとTrueがリターンされてしまいました。
再現方法
src_path = '/databricks-datasets/tpch/data-001/region/region.tbl'
out_path = '/tmp/delete'
oup_path_for_py = '/dbfs' + out_path
# dbfsにコピーしたファイルを保存
dbutils.fs.cp(src_path, out_path, True)
# ファイルを削除
dbutils.fs.rm(out_path, True)
# dbutilsにてファイルの存在チェックを行う。想定は、ファイルが存在しないことによるエラーが発生
try:
dbutils.fs.ls(out_path)
except Exception as e:
print(e)
import os
os.path.exists(oup_path_for_py)
対応方法
情報がキャッシュされてしまうことが原因であるようで、1秒のスリープを実装することで誤検知しなくなるようです。dbutils.fs.lsを用いて存在チェックを行う方法もあるため、下記の対応方法を紹介します。
- sleep関数で1秒待ってから実行
- dbutils.fs.lsを用いた存在チェックの関数を作成
1. sleep関数で1秒待ってから実行
import time
import os
time.sleep(1)
os.path.exists(oup_path_for_py)
2. dbutils.fs.lsを用いた存在チェックの関数を作成
def fs_is(path: str):
return_bool = True
# dbutils.fs.lsにてエラーとなる場合に、ファイルが存在しないというリターンを返す
try:
file_list = dbutils.fs.ls(path)
except:
return_bool = False
return return_bool
fs_is(oup_path_for_py)