Как читать табличные данные на 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.