我有一个已定义的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集群时,只会读取一个文件,只保留一个节点。
是否有更有效的方法来读取多个文件?一种让所有节点同时工作的方法吗?
更多详情:
答案 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是一份帮助我理解这些概念以及如何调整它们的文档。
回到我的问题,在那种情况下,每个文件我会有一个工人。