Создание Spark RDD из файла, расположенного на Google Диске, с использованием Python в Colab.Research.Google

Мне удалось запустить программу Python 3/Spark 2.2.1 на платформе Google Colab.Research:

!apt-get update
!apt-get install openjdk-8-jdk-headless -qq > /dev/null
!wget -q http://apache.osuosl.org/spark/spark-2.2.1/spark-2.2.1-bin-hadoop2.7.tgz
!tar xf spark-2.2.1-bin-hadoop2.7.tgz
!pip install -q findspark

import os
os.environ["JAVA_HOME"] = "/usr/lib/jvm/java-8-openjdk-amd64"
os.environ["SPARK_HOME"] = "/content/spark-2.2.1-bin-hadoop2.7"

import findspark
findspark.init()
from pyspark.sql import SparkSession
spark = SparkSession.builder.master("local[*]").getOrCreate()

это отлично работает, когда я загружаю текстовые файлы с моего локального компьютера на виртуальную машину Unix, используя

from google.colab import files
datafile = files.upload()

и прочитайте их следующим образом:

textRDD = spark.read.text('hobbit.txt').rdd

Все идет нормально ..

Моя проблема начинается, когда я пытаюсь прочитать файл, который лежит в моем каталоге colab на диске Google.

Следуя инструкциям, я аутентифицировал пользователя и создал службу привода

from google.colab import auth
auth.authenticate_user()

from googleapiclient.discovery import build
drive_service = build('drive', 'v3')

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

file_id = '1RELUMtExjMTSfoWF765Hr8JwNCSL7AgH'

import io
from googleapiclient.http import MediaIoBaseDownload

request = drive_service.files().get_media(fileId=file_id)
downloaded = io.BytesIO()
downloader = MediaIoBaseDownload(downloaded, request)
done = False
while done is False:
  # _ is a placeholder for a progress object that we ignore.
  # (Our file is small, so we skip reporting progress.)
  _, done = downloader.next_chunk()

downloaded.seek(0)
print('Downloaded file contents are: {}'.format(downloaded.read()))

Downloaded file contents are: b'The king beneath the mountain\r\nThe king of ......

даже это работает отлично..

downloaded.seek(0)
print(downloaded.read().decode('utf-8'))

и получает данные

The king beneath the mountain
The king of carven stone
The lord of silver fountain ...

где все, НАКОНЕЦ, ИДЕТ НЕ ТАК, где я пытаюсь получить эти данные и поместить их в искровой RDD

downloaded.seek(0)
tRDD = spark.read.text(downloaded.read().decode('utf-8'))

и получаю ошибку..

AnalysisException: 'Path does not exist: file:/content/The king beneath the mountain\ ....

Очевидно, я не использую правильный метод/параметры для чтения файла в spark. Я пробовал довольно много из описанных методов

Буду очень признателен, если кто-нибудь поможет мне разобраться, как читать этот файл для последующей обработки.


person Calcutta    schedule 17.04.2018    source источник
comment
Вы можете начать с вопроса, что вызывает искру . Команда read.text() принимает в качестве аргументов. В документах говорится, что он читает HDFS/локальную файловую систему/любой URI файловой системы, поддерживаемый Hadoop, ни один из которых не связан с API диска.   -  person noogui    schedule 17.04.2018
comment
поэтому я надеялся, что будет какой-то другой метод, с помощью которого я смогу прочитать данные. буду признателен, если кто-то подскажет альтернативный метод   -  person Calcutta    schedule 19.04.2018


Ответы (2)


Полное решение этой проблемы доступно в другом вопросе StackOverflow, который доступен по этому URL.

Вот блокнот, в котором продемонстрировано это решение.

Я проверил это, и это работает!

person Calcutta    schedule 19.04.2018

Кажется, что spark.read.text ожидает имя файла. Но вместо этого вы даете ему содержимое файла. Вы можете попробовать любой из них:

  • сохраните его в файл, затем дайте имя
  • используйте только downloaded вместо downloaded.read().decode('utf-8')

Вы также можете упростить загрузку с Google Диска с помощью pydrive. Я привел пример здесь.

https://gist.github.com/korakot/d56c925ff3eccb86ea5a16726a70b224

Загрузка просто

fid = drive.ListFile({'q':"title='hobbit.txt'"}).GetList()[0]['id']
f = drive.CreateFile({'id': fid})
f.GetContentFile('hobbit.txt')
person korakot    schedule 17.04.2018
comment
Я пытался избежать записи файла на диск виртуальной машины, а затем снова прочитать его в искру ... но если ничего другого не получится, буду использовать это - person Calcutta; 18.04.2018