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

时间:2017-09-15 13:03:09

标签: python amazon-s3 pyspark jupyter-notebook

我正在使用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为{{1},该怎么办? }}。如何同时导入多个路径以获取一个数据帧?我是否需要将它们全部作为数据帧存储,然后在PySpark中将它们连接在一起? (您可以假设它们所有CSV都具有相同的架构)
  2. 假设现在是2014年11月。如果我想再次运行分析,但是最近的数据"例如运行2014年12月12月14日?例如,我想在12月14日加载文件2:.load('file:///home/path/NYCweather/data2015/*.csv')并使用此文件:.load('file:///home/path/datafolder/data2014/dec14/*.csv')进行原始分析。有没有办法安排Jupyter笔记本(或类似)更新加载路径并导入最新的运行(在这种情况下' nov14'将替换为' dec14'然后& #39; jan15'等)。
  3. 我查看了之前的问题,但由于这是AWS / PySpark特定的集成,因此无法找到答案。

    提前感谢您的帮助!

    [背景:我可以从包含各种大数据集的各个团队访问许多S3存储桶。将它复制到我的S3存储桶,然后构建一个Jupyter笔记本看起来要比直接从他们的存储桶中提取数据并在其上构建模型/表/等并将处理后的输出保存到数据库中要多得多。因此,我发布上述问题。如果我的想法完全错误,请阻止我! :)]

1 个答案:

答案 0 :(得分:2)

只要文件都采用相同的格式,您就可以使用通配符读取多个路径。

在你的例子中:

.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个加载语句,以便同时将所有csv读取到一个数据帧:

.load('file:///home/path/*/*/*.csv')

如果您想更具体一些,以避免阅读某些文件/文件夹,您可以执行以下操作:

.load('file:///home/path/[SF|NYC]weather/data201[4|5]/*.csv')