Ошибка ввода-вывода диска Sqlite (python — databricks)

#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, пока соединение все еще активно.