2017-07-17 22 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

查看我的编辑... –