[英]Reading Multiple S3 Folders / Paths Into PySpark
我正在使用 PySpark 进行大数据分析。我可以使用以下命令导入存储在特定存储桶的特定文件夹中的所有 CSV 文件:
df = sqlContext.read.format('com.databricks.spark.csv').options(header='true', inferschema='true').load('file:///home/path/datafolder/data2014/*.csv')
(其中 * 充当通配符)
我遇到的问题如下:
.load('file:///home/path/SFweather/data2014/*.csv')
,文件 2 是.load('file:///home/path/SFweather/data2015/*.csv')
文件 3 是.load('file:///home/path/NYCweather/data2014/*.csv')
文件 4 是.load('file:///home/path/NYCweather/data2015/*.csv')
。 如何同时导入多个路径得到一个dataframe? 我是否需要将它们全部单独存储为数据帧,然后在 PySpark 内将它们连接在一起? (您可以假设它们所有的 CSV 都具有相同的架构).load('file:///home/path/datafolder/data2014/dec14/*.csv')
并使用此文件: .load('file:///home/path/datafolder/data2014/nov14/*.csv')
用于原始分析。 有没有办法安排 Jupyter notebook(或类似笔记本)更新加载路径并导入最新运行(在这种情况下,'nov14' 将被 'dec14' 和 'jan15' 等替换)。我查看了之前的问题,但无法找到答案,因为这是特定于 AWS / PySpark 集成的。
预先感谢您的帮助!
[背景:我被授予访问来自不同团队的许多 S3 存储桶的权限,这些存储桶包含各种大数据集。 将其复制到我的 S3 存储桶,然后构建一个 Jupyter 笔记本似乎比直接从他们的存储桶中提取数据并在其上构建 model/表/等并将处理后的 output 保存到数据库中要多得多。 因此,我发布了上面的问题。 如果我的想法完全错误,请阻止我::)]
您可以使用通配符在多个路径中进行读取,只要文件的格式都相同即可。
在您的示例中:
.load('file:///home/path/SFweather/data2014/*.csv')
.load('file:///home/path/SFweather/data2015/*.csv')
.load('file:///home/path/NYCweather/data2014/*.csv')
.load('file:///home/path/NYCweather/data2015/*.csv')
您可以将以下4条load语句替换为以下路径,以一次将所有csv读入一个数据帧:
.load('file:///home/path/*/*/*.csv')
如果您想更具体一些以避免读取某些文件/文件夹,则可以执行以下操作:
.load('file:///home/path/[SF|NYC]weather/data201[4|5]/*.csv')
您可以使用模式字符串列表一次加载多个路径。 pyspark.sql.DataFrameReader.load
方法接受路径字符串列表,如果您不能使用单个Hadoop glob 模式表达要加载的所有路径,这将特别有用:
?
Matches any single character.
*
Matches zero or more characters.
[abc]
Matches a single character from character set {a,b,c}.
[a-b]
Matches a single character from the character range {a...b}.
Note that character a must be lexicographically less than or
equal to character b.
[^a]
Matches a single character that is not from character set or
range {a}. Note that the ^ character must occur immediately
to the right of the opening bracket.
\c
Removes (escapes) any special meaning of character c.
{ab,cd}
Matches a string from the string set {ab, cd}
{ab,c{de,fh}}
Matches a string from the string set {ab, cde, cfh}
例如,如果要加载以下路径:
[
's3a://bucket/prefix/key=1/year=2010/*.csv',
's3a://bucket/prefix/key=1/year=2011/*.csv',
's3a://bucket/prefix/key=2/year=2020/*.csv',
's3a://bucket/prefix/key=2/year=2021/*.csv',
]
您可以将它们减少为两种路径模式,
s3a://bucket/prefix/key=1/year=201[0-1]/*.csv
和s3a://bucket/prefix/key=2/year=202[0-1]/*.csv
, 并调用load()
两次。 您可以进一步将 go 减少为使用{ab,cd}
交替的单个模式字符串,但我认为通过一次调用load()
使用 glob 模式来表达这些路径的最易读的方法是传递路径列表模式:
spark.read.format('csv').load(
[
's3a://bucket/prefix/key=1/year=201[0-1]/*.csv',
's3a://bucket/prefix/key=2/year=202[0-1]/*.csv',
]
)
对于您在问题 № 1 中列出的路径,您可以用一个模式字符串来表达所有四个:
'file:///home/path/{NY,SF}weather/data201[45]/*.csv'
对于您的问题 № 2,您可以编写逻辑来构建您要加载的路径。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.