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

Posted

技术标签:

【中文标题】如何在 pyspark 中读取 s3 上的表格数据?【英文标题】:How to read tabular data on s3 in pyspark? 【发布时间】:2017-07-17 06:01:56 【问题描述】:

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

现在,我告诉 pyspark 我想使用 \t 作为分隔符来读取 one 文件,如下所示:

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 这是一个制表符分隔的文件而不是 parquet 文件?

或者,有没有更简单的方法可以一次读取整个目录中的这些文件?

谢谢。

编辑:我使用的是 pyspark 版本 1.6.1 *

文件在 s3 上,所以我不能使用通常的:

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

因为当我尝试这样做时,我得到了java.io.IOException: No input paths specified in job

还有什么我可以尝试的吗?

【问题讨论】:

【参考方案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 支持正则表达式/glob。所以你可以这样做:

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

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

【讨论】:

不,抱歉,这不起作用。首先,我得到AttributeError: 'DataFrameReader' object has no attribute 'csv' 上面的代码。而且,当我尝试执行 indata_creds = spark_session.read.option('sep', '\t').load('s3://mybucket/my/directory/onefile.txt') 时,我收到了与我发布的关于镶木地板文件相同的错误。 可能还有其他选择:1) 有没有办法在 s3 上将所有这些文本文件压缩成几个 parquet 文件? 2)有没有办法一次读取整个目录? 您发布的第一个选项仍然不起作用。我得到no input paths specified,但是当我检查 s3 时,文件显然在那里。 您是否下载了 jar 并将其放在您的 EC2 实例上?该解决方案应该有效。否则你只是做错了。【参考方案2】:

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

【讨论】:

以上是关于如何在 pyspark 中读取 s3 上的表格数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何从数据帧列中的路径读取 AWS 上 pyspark 中的许多 Json 文件?

PySpark S3 文件读取性能考虑

使用 pyspark 从 s3 位置读取镶木地板文件的文件夹到 pyspark 数据帧

PySpark:在 Spark 数据框中读取多个 XML 文件(s3 路径列表)

PYSPARK - 如何读取 S3 中所有子文件夹中的所有 csv 文件?

无法使用 Pyspark 2.4.4 读取 s3 存储桶中的镶木地板文件