Проблема при попытке прочитать текстовый файл в databricks с использованием локального файлового API, а не Spark API

#apache-spark #pyspark #databricks #sparkapi

Вопрос:

Я пытаюсь прочитать небольшой текстовый файл, который добавляется в виде таблицы в базу данных по умолчанию в Databricks. При попытке прочитать файл через Local File API я получаю FileNotFoundError , но я могу прочитать тот же файл, что и Spark RDD, используя SparkContext.

Пожалуйста, найдите код ниже:

 with open("/FileStore/tables/boringwords.txt", "r") as f_read:
  for line in f_read:
    print(line)
 

Это дает мне ошибку:

 FileNotFoundError                         Traceback (most recent call last)
<command-2618449717515592> in <module>
----> 1 with open("dbfs:/FileStore/tables/boringwords.txt", "r") as f_read:
      2   for line in f_read:
      3     print(line)

FileNotFoundError: [Errno 2] No such file or directory: 'dbfs:/FileStore/tables/boringwords.txt'
 

Где как, у меня нет проблем с чтением файла с помощью SparkContext:

 boring_words = sc.textFile("/FileStore/tables/boringwords.txt")
set(i.strip() for i in boring_words.collect())
 

И, как и ожидалось, я получаю результат для приведенного выше блока кода:

 Out[4]: {'mad',
 'mobile',
 'filename',
 'circle',
 'cookies',
 'immigration',
 'anticipated',
 'editorials',
 'review'}
 

Я также ссылался на документацию DBFS здесь, чтобы понять ограничения локального файлового API, но не смог разобраться в этой проблеме.
Любая помощь будет принята с благодарностью. Спасибо!

Ответ №1:

Проблема в том, что вы используете open функцию, которая работает только с локальными файлами и ничего не знает о DBFS или других файловых системах. Чтобы это сработало, вам нужно использовать DBFS local file API и добавить /dbfs префикс к пути к файлу: /dbfs/FileStore/.... :

 with open("/dbfs/FileStore/tables/boringwords.txt", "r") as f_read:
  for line in f_read:
    print(line)
 

Ответ №2:

В качестве альтернативы вы можете просто использовать встроенный метод csv:

 df = spark.read.csv("dbfs:/FileStore/tables/boringwords.txt")
 

Ответ №3:

В качестве альтернативы мы можем использовать dbutils

 files = dbutils.fs.ls('/FileStore/tables/')
li = []
for fi in files: 
  print(fi.path)
 

Пример ,

введите описание изображения здесь