如何在 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 数据帧
PySpark:在 Spark 数据框中读取多个 XML 文件(s3 路径列表)