繁体   English   中英

将多个 S3 文件夹/路径读入 PySpark

[英]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')

(其中 * 充当通配符)

我遇到的问题如下:

  1. 如果我想对 2014 年和 2015 年的数据进行分析,即文件 1 是.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 都具有相同的架构)
  2. 假设现在是 2014 年 11 月。 如果我想再次运行分析,但在“最新数据”上运行,例如 2014 年 12 月的 dec14,该怎么办? 例如,我想在 12 月 14 日加载文件 2: .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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM