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

0

Вопрос

Я пытаюсь прочитать небольшой txt-файл, который добавляется в виде таблицы в базу данных по умолчанию в Databricks. При попытке прочитать файл через локальный файловый 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, но не имел представления об этой проблеме. Любая помощь будет очень признательна. Спасибо!

apache-spark databricks pyspark sparkapi
2021-11-24 06:16:55
3
0

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

with open("/dbfs/FileStore/tables/boringwords.txt", "r") as f_read:
  for line in f_read:
    print(line)
2021-11-24 07:56:14
0

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

df = spark.read.csv("dbfs:/FileStore/tables/boringwords.txt")
2021-11-24 08:51:27
0

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

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

Пример ,

enter image description here

2021-11-24 18:26:17

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................