2017-07-17 23 views
0

我在目錄s3://mybucket/my/directory/的s3上有一些製表符分隔的數據。現在如何讀取pyspark中s3的表格數據?

,我告訴我要使用\t作爲分隔符讀取只是一個文件中像這樣pyspark:

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

其他我可以嘗試嗎?

回答

0

實際的問題是我需要將我的AWS密鑰添加到我的spark-env.sh文件中。

1

由於您使用的Apache 1.6.1星火,你需要spark-csv使用此代碼:

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

這應該工作!

另一種選擇是例如這個answer。而不是用逗號分割,你可以用它來分割它。然後將RDD加載到數據幀中。但是,第一個選項更簡單,並已將其加載到數據框中。

對於您的備選方案,我不會將其轉換爲實木複合地板文件。除非數據真的很大並且需要壓縮,否則不需要它。

對於評論中的第二個問題,是的,可以讀取整個目錄。 Spark支持正則表達式/ glob。所以你可以這樣做:

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

順便說一句,爲什麼你不使用2.x.x?它也可用於aws。

+0

沒有抱歉,這不起作用。首先,我得到'AttributeError:'DataFrameReader'對象沒有屬性'csv',你的代碼在上面。並且,當我嘗試執行'indata_creds = spark_session.read.option('sep','\ t').load('s3://mybucket/my/directory/onefile.txt')'我得到同樣的錯誤我發佈了關於鑲木地板文件。 – Sother

+0

可能有其他的選擇:1)有沒有辦法將所有這些文本文件壓縮成s3上的幾個實木複合地板文件? 2)是否有一種方法可以一次讀取整個目錄? – Sother

+1

查看我的編輯... –