如何在pyspark中读取s3上的表格数据?

时间:2017-07-17 06:01:56

标签: amazon-s3 amazon-ec2 pyspark parquet pyspark-sql

我在目录s3://mybucket/my/directory/中的s3上有一些制表符分隔数据。

现在,我告诉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 个答案:

答案 0 :(得分:1)

由于您正在使用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')

这应该有用!

另一种选择是例如answer。您可以使用逗号分隔它,而不是用逗号分割它。然后将RDD加载到数据帧中。但是,第一个选项更容易,并已将其加载到数据框中。

如果您的评论中有替代方案,我不会将其转换为镶木地板文件。除非您的数据非常庞大并且需要压缩,否则不需要它。

对于评论中的第二个问题,是的,可以阅读整个目录。 Spark支持regex / glob。所以你可以这样做:

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

顺便问一下,你为什么不使用2.x.x?它也可以在aws上使用。

答案 1 :(得分:0)

实际问题是我需要将我的AWS密钥添加到我的spark-env.sh文件中。