Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 如何使用Spark在加入(广播)和收集之间进行选择_Apache Spark_Apache Spark Sql - Fatal编程技术网

Apache spark 如何使用Spark在加入(广播)和收集之间进行选择

Apache spark 如何使用Spark在加入(广播)和收集之间进行选择,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我用的是Spark 2.2.1 我有一个小数据帧(小于1M),我有一个大数据帧上的计算,需要这个小数据帧来计算UDF中的一列 关于性能的最佳选择是什么 广播这个DF是否更好(我不知道Spark是否会将笛卡尔坐标转换到内存中) 或者收集它并直接在udf中使用small值 val small = smallDF.collect() bigDF.withColumn(udf($"colFromBig")) 两者都将首先收集数据,因此在内存占用方面没有区别。因此,选择应该由逻辑决定: 如果您可以比默

我用的是Spark 2.2.1

我有一个小数据帧(小于1M),我有一个大数据帧上的计算,需要这个小数据帧来计算UDF中的一列

关于性能的最佳选择是什么

广播这个DF是否更好(我不知道Spark是否会将笛卡尔坐标转换到内存中)

或者收集它并直接在udf中使用
small

val small = smallDF.collect()
bigDF.withColumn(udf($"colFromBig"))

两者都将首先收集数据,因此在内存占用方面没有区别。因此,选择应该由逻辑决定:

  • 如果您可以比默认执行计划做得更好,并且不想创建自己的执行计划,
    udf
    可能是一种更好的方法
  • 如果它只是一个笛卡尔坐标系,并且需要后续的
    分解
    -尽管如此,还是销毁它-只需使用前一个选项即可
正如第二种情况中的建议,您可以使用广播

val small = spark.spark.broadcast(smallDF.collect())
bigDF.withColumn(udf($"colFromBig"))

如果重用
udf
,它可能会提供一些性能改进。

交叉连接将为第一个DF中的每一行创建一个或多个smallDF行。内存占用将更高,在切换到第二种方法之前,我得到了很多OOM。当然,只有在UDFBtw中有必要时,手动广播才更好。请建议手动广播,而不是直接引用:)@T.Gawęda我将重点关注明确的论点,我不确定广播在这里是否有益,但已完成:)
val small = spark.spark.broadcast(smallDF.collect())
bigDF.withColumn(udf($"colFromBig"))