Apache spark 具有多个联合的spark脚本运行时间过长

Apache spark 具有多个联合的spark脚本运行时间过长,apache-spark,pyspark,Apache Spark,Pyspark,我写了一个pyspark脚本,运行时间太长了。我的脚本的基本流程是,它获取大量原始数据并将其加载到数据帧中。然后,它将数据帧拆分为逻辑小的数据帧s,对每个数据帧执行聚合,然后执行联合以将它们重新组合为一个数据帧 我无法粘贴我的原始脚本,因为它属于我的雇主,但我已成功隔离此场景,并在pyspark命令行上使用以下命令复制它: df1 = spark.createDataFrame([(1,'sally'),(2, 'john')],['id','first_name']) df1 = df1.un

我写了一个pyspark脚本,运行时间太长了。我的脚本的基本流程是,它获取大量原始数据并将其加载到
数据帧中。然后,它将
数据帧
拆分为逻辑小的
数据帧
s,对每个数据帧执行聚合,然后执行联合以将它们重新组合为一个
数据帧

我无法粘贴我的原始脚本,因为它属于我的雇主,但我已成功隔离此场景,并在pyspark命令行上使用以下命令复制它:

df1 = spark.createDataFrame([(1,'sally'),(2, 'john')],['id','first_name'])
df1 = df1.union(df1)
df1.count()
当我在本地运行这段代码时,大约需要4分钟来获得数据帧行的计数。缓存数据帧有助于将其缩短到一分钟以下,但我仍然认为ApacheSpark无法接受这一点,因为ApacheSpark通常可以在几秒钟内处理数百万行


我能够重组我的代码以避免使用联合,但如果有人能向我展示我粘贴的代码示例的更好的工作版本,我将不胜感激。我相信这是apache spark应该能够高效完成的事情,作为spark的新开发人员,如果我能够更深入地了解如何修复此代码,这将对我非常有帮助。

在您的实现中,联盟的计划需要指数级的时间。
为了避免规划成本,您可以这样做:

def unionAll(*dfs):
    first, *_ = dfs  # Python 3.x, for 2.x you'll have to unpack manually
    return first.sql_ctx.createDataFrame(
        first.sql_ctx._sc.union([df.rdd for df in dfs]),
        first.schema
    )

您应该考虑到,通过这种方式,您有转换为rdd并返回数据帧的成本。

您正在创建一个2^n数据帧的并集。你确定这就是你要做的吗?如果你有一个数据帧列表,你可以做
reduce(DataFrame.unionAll,dfs)
。看见