如何选择加入(广播)和收集Spark

时间:2018-02-02 13:21:01

标签: apache-spark apache-spark-sql

我正在使用Spark 2.2.1。

我有一个小的DataFrame(小于1M),我在一个大的DataFrame上进行计算,需要这个小的DataFrame来计算UDF中的列。

关于表现的最佳选择

播放这个DF是否更好(我不知道Spark是否会将笛卡尔语转换为内存)。

fib3

或收集它并直接在udf

中使用bigDF.crossJoin(broadcast(smallDF)) .withColumn(udf("$colFromSmall", $"colFromBig"))
small

1 个答案:

答案 0 :(得分:1)

两者都将postTest() async { const body = "This is my body"; var httpclient = new HttpClient(); await httpclient .postUrl(Uri.parse( "http://httpbin.org/post")) .then( (HttpClientRequest request) { request.headers.contentLength = body.length; request.write(body); return request.close(); }).then((HttpClientResponse response) async { print(response.statusCode); print(response.headers); print(await response .transform(UTF8.decoder) .join()); }); } 数据放在首位,因此就内存占用而言,没有区别。所以选择应该由逻辑决定:

  • 如果您可以做得比默认执行计划更好,并且不想创建自己的,collect可能是更好的方法。
  • 如果它只是一个笛卡儿,并且需要随后的udf - 那么就会消亡 - 只需选择前一个选项。

根据in the comments在第二种情况下的T.Gawęda建议您可以使用广播

explode

如果重复使用val small = spark.spark.broadcast(smallDF.collect()) bigDF.withColumn(udf($"colFromBig")) ,它可能会提供一些性能改进。