Problem, gdy próbuje odczytać plik tekstowy w bazach danych z wykorzystaniem API plików lokalnych, a nie API Spark

0

Pytanie

Staram się czytać mały txt-plik, który jest dodawany w postaci tabeli w bazie danych domyślnie w Databricks. Podczas próby odczytu pliku przez lokalny file API dostaję FileNotFoundErrorale mogę przeczytać ten sam plik, co i Spark RDD, za pomocą SparkContext.

Proszę, znajdź kod poniżej:

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

To daje mi błąd:

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'

Gdzie jak nie mam problemów z czytania pliku za pomocą SparkContext:

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

I, zgodnie z oczekiwaniami, otrzymuję wynik powyższego bloku kodu:

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

Ja także uwagę na dokumentację DBFS tutaj, aby zrozumieć ograniczenia lokalnego plików API, ale nie miał pojęcia o tym problemie. Każda pomoc będzie bardzo wdzięczna. Dziękuję!

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

Problem w tym, że używasz open funkcja, która działa tylko z plikami lokalnymi i nic nie wie o DBFS lub innych systemach plików. Aby to zadziałało, musisz użyć API lokalnych plików DBFS i dodać /dbfs prefiks ścieżki do pliku: /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

Alternatywnie można po prostu skorzystać z wbudowanego metoda csv:

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

Alternatywnie możemy użyć dbutils

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

Przykład

enter image description here

2021-11-24 18:26:17

W innych językach

Ta strona jest w innych językach

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