apache-spark - 如何进行安静的服务调用以快速(er)更新数据框的列?
问题描述
我们需要调用一个外部的 restful 服务来更新 a 中的列值Dataset
。我们正在使用 UDF 函数来进行非常慢的安静服务调用。
dataset.withColumn("upper", upperUDF('call restful service'))
这是一个同步呼叫,25,000 个帐户花费了大约 1 小时 10 分钟(每个帐户发出一个呼叫)。
如何让它更快?
解决方案
我建议将 转换Dataset
为RDD
usingDataset.rdd
然后RDD.foreachPartition
。
val names = Seq("hello", "world").toDF("name")
scala> names.show
+-----+
| name|
+-----+
|hello|
|world|
+-----+
scala> names.rdd.foreachPartition(p => p.map(n => "call restful service for " + n).foreach(println))
call restful service for [hello]
call restful service for [world]
然后,您可以为相同的条目考虑一个本地缓存,以避免耗时的 restful 服务调用。
从评论:
这如何提高性能?
RDD.foreachPartition
使您可以作为迭代器访问所有元素(惰性和内存友好),因此您可以通过使用本地缓存(每个分区或每个执行程序,因此在执行程序上执行的所有分区/任务都可以使用缓存)来避免外部调用。可以更改分区数量以避免过多的并行外部调用 (DDOS)。使用
RDD.repartition
或RDD.coalesce
运算符。此外,您可以通过用于从中读取数据集的数据源来控制分区数。
从 API 获取响应后如何更新相应的列
由于您离开了 Dataset API 并希望使用 RDD API 进行外部调用,所以问题是如何从 RDD 回到 Datasets。就这么简单RDD.toDF(comma-separated column names)
。这些列必须与 RDD 表示匹配,并且取决于 RDD 的案例类。
推荐阅读
- ios - 如何在 iOS 中制作自定义文件夹/相册
- javascript - 使用内联样式 ReactJS 基于滚动值旋转图像
- wordpress - 如何将我的实时站点下载到本地环境以使用 Git 进行设置?
- python-3.x - BeautifulSoup 没有找到所有“th”
- python - Python 从 Mocked 全局变量初始化全局变量不起作用?
- woocommerce - woocommerce 类别的自定义字段并显示在主页中
- javascript - 在其他情况下如何忽略循环
- vue.js - 变异函数不影响状态变量
- android - 由 java.lang.SecurityException 引起:UID 10243 没有对 content://media/external/audio/media/5927 [user 0] 的权限
- ios - 当 StackView 中 numberOfLines 不同于 1(默认)时,UILabels 宽度问题