#python #sqlite #databricks
#python #sqlite #databricks
Вопрос:
Итак, я запускаю кластер на Databricks. когда я пытаюсь запросить файл sqlite на нем следующим образом:
import sqlite3
conn = sqlite3.connect("/dbfs/FileStore/testing.sqlite")
cur = conn.cursor()
cur.execute('''SELECT * FROM ZACCELEROMETER''')
Я получаю эту ошибку:
OperationalError Traceback (most recent call last)
<command-163> in <module>
----> 1 cur.execute('''SELECT * FROM ZACCELEROMETER''')
OperationalError: disk I/O error
Стоит упомянуть, что я могу запросить этот точный файл локально на Jupiter. Еще одна необычная вещь — в databricks я попытался открыть пример файла SQLite, который я нашел в Интернете, под названием «Chinook_Sqlite.SQLite», он отлично работает без ошибок, в отличие от первого файла.
Я думаю, что это может быть что-то с кодировкой первого файла SQLite.
Любое предложение будет с благодарностью! Пожалуйста, дайте мне знать, если что-то неясно.
Спасибо!
Комментарии:
1. Это в удаленной файловой системе?
2. @Shawn Я подключил это DBFS databricks ( docs.databricks.com/data/databricks-file-system.html ). Есть идеи, что это работает с некоторыми файлами sqlite, но с другими возникает ошибка ввода-вывода с диска?
3. Я понятия не имею, что такое databricks, но по этой ссылке «распределенная файловая система»? Да, это, вероятно, проблема. Sqlite не предназначен для использования в сетевых файловых системах, только в локальных. Вы можете просмотреть расширенные коды ошибок для более конкретной причины сбоя, но блокировка, в частности, является слабым местом для многих из них.
Ответ №1:
Для всех, кто столкнется с этой проблемой в будущем, я нашел решение, и я думаю, что оно будет работать в любой распределенной файловой системе.
conn = sqlite3.connect('data.sqlite')
curr = conn.execute('PRAGMA locking_mode = EXCLUSIVE')
Просто запустите вторую строку, и она должна работать. Я полагаю, что проблема заключалась в том, что sqlite предназначен для локального запуска (т. Е. Запуска На одной машине), поэтому в NFS установка режима блокировки файла sqlite на эксклюзивный позволит только одному пользователю получить доступ к файлу sqlite, пока соединение все еще активно.