Как читать табличные данные на s3 в pyspark?

У меня есть некоторые разделенные табуляцией данные на s3 в каталоге s3://mybucket/my/directory/,

Теперь я говорю pyspark, что я хочу использовать \t в качестве разделителя для чтения только в одном файле, как это:

from pyspark import SparkContext

from pyspark.sql import HiveContext, SQLContext, Row
from pyspark.sql.types import *
from datetime import datetime
from pyspark.sql.functions import col, date_sub, log, mean, to_date, udf, unix_timestamp
from pyspark.sql.window import Window
from pyspark.sql import DataFrame

sc =SparkContext()
sc.setLogLevel("DEBUG")
sqlContext = SQLContext(sc)
indata_creds = sqlContext.read.load('s3://mybucket/my/directory/onefile.txt').option("delimiter", "\t")

Но это говорит мне: assertion failed: No predefined schema found, and no Parquet data files or summary files found under s3://mybucket/my/directory/onefile.txt

Как мне сказать pyspark, что это файл с разделителями табуляции, а не файл паркета?

Или есть более простой способ прочитать все эти файлы во всем каталоге одновременно?

Благодарю.

  • РЕДАКТИРОВАТЬ: я использую pyspark версии 1.6.1 *

Файлы на s3, поэтому я не могу использовать обычные:

indata_creds = sqlContext.read.text('s3://mybucket/my/directory/')

потому что, когда я пытаюсь это сделать, я получаю java.io.IOException: No input paths specified in job

Что-нибудь еще я могу попробовать?

2 ответа

Решение

Фактическая проблема заключалась в том, что мне нужно было добавить ключи AWS в мой spark-env.sh файл.

Поскольку вы используете Apache Spark 1.6.1, вам нужен spark-csv для использования этого кода:

indata_creds = sqlContext.read.format('com.databricks.spark.csv').option('delimiter', '\t').load('s3://mybucket/my/directory/onefile.txt')

Это должно работать!

Другой вариант, например, этот ответ. Вместо того, чтобы разделять это запятой, вы можете использовать его для разделения по вкладкам. Затем загрузите СДР в информационный кадр. Тем не менее, первый вариант проще и уже загружает его в массив данных.

Для вашего варианта в вашем комментарии, я бы не стал конвертировать его в паркетные файлы. В этом нет необходимости, кроме случаев, когда ваши данные действительно огромны и требуется сжатие.

На ваш второй вопрос в комментарии да можно прочитать весь каталог. Spark поддерживает регулярные выражения / glob. Так что вы можете сделать что-то вроде этого:

indata_creds = sqlContext.read.format('com.databricks.spark.csv').option('delimiter', '\t').load('s3://mybucket/my/directory/*.txt')

Кстати, почему вы не используете 2.xx? Это также доступно на AWS.

Другие вопросы по тегам