Spark - 如何将多个文件并行读取为DataFrame?

时间:2018-01-22 18:14:50

标签: amazon-s3 pyspark-sql

我有一个已定义的S3文件路径列表,我想将它们作为DataFrames读取:

ss = SparkSession(sc)
JSON_FILES = ['a.json.gz', 'b.json.gz', 'c.json.gz']
dataframes = {t: ss.read.json('s3a://bucket/' + t) for t in JSON_FILES}

上面的代码有效,但是以一种意想不到的方式。当代码提交给Spark集群时,只会读取一个文件,只保留一个节点。

是否有更有效的方法来读取多个文件?一种让所有节点同时工作的方法吗?

更多详情:

  • PySpark - Spark 2.2.0
  • 存储在S3上的文件
  • 每个文件每行包含一个JSON对象
  • 文件已被压缩,因为它们的扩展名可以看到

2 个答案:

答案 0 :(得分:0)

要在Spark中读取多个输入,请使用通配符。无论您是构建数据帧还是rdd,都是如此。

ss = SparkSession(sc)

dataframes = ss.read.json("s3a://bucket/*.json.gz")

答案 1 :(得分:0)

问题是:我没有理解Spark的运行时架构。 Spark有"工人"的概念,如果我现在更好地理解它(不要相信我),它能够并行地做事。当我们提交Spark作业时,我们可以设置两者,工作者数量和他们可以利用的并行度。

如果您使用Spark命令spark-submit,则这些变量表示为以下选项:

  • --num-executors:类似于工人数量的概念
  • --executor-cores:单个工作人员应使用多少CPU核心

This是一份帮助我理解这些概念以及如何调整它们的文档。

回到我的问题,在那种情况下,每个文件我会有一个工人。