- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Apache Spark pyspark.RDD
API 文档提到 groupByKey()
效率低下。相反,建议使用 reduceByKey()
, aggregateByKey()
, combineByKey()
, 或 foldByKey()
反而。这将导致在 shuffle 之前在工作线程中进行一些聚合,从而减少跨工作线程的数据混洗。
给定以下数据集和 groupByKey()
表达式,什么是不使用 groupByKey()
的等效且有效的实现(减少跨 worker 数据混洗) ,但提供相同的结果?
dataset = [("a", 7), ("b", 3), ("a", 8)]
rdd = (sc.parallelize(dataset)
.groupByKey())
print sorted(rdd.mapValues(list).collect())
[('a', [7, 8]), ('b', [3])]
最佳答案
据我所知,在这种特殊情况下,使用 aggregateByKey
没有任何好处*或类似的功能。由于您正在构建一个列表,因此没有“真正的”减少,必须改组的数据量或多或少相同。
要真正观察到一些性能提升,您需要进行实际减少传输数据量的转换,例如计数、计算汇总统计数据、查找唯一元素。
关于使用 reduceByKey()
的不同好处, combineByKey()
, 或 foldByKey()
当您考虑 Scala API 签名时,有一个重要的概念差异。
两者 reduceByKey
和 foldByKey
map 来自 RDD[(K, V)]
至 RDD[(K, V)]
而第二个提供额外的零元素。
reduceByKey(func: (V, V) ⇒ V): RDD[(K, V)]
foldByKey(zeroValue: V)(func: (V, V) ⇒ V): RDD[(K, V)]
combineByKey
(没有
aggregateByKey
,但它是相同类型的转换)从
RDD[(K, V)]
转换而来至
RDD[(K, C)]
:
combineByKey[C](
createCombiner: (V) ⇒ C,
mergeValue: (C, V) ⇒ C,
mergeCombiners: (C, C) ⇒ C): RDD[(K, C)]
combineByKey
(在 PySpark
aggregateByKey
中)确实适用,因为您是从
RDD[(String, Int)]
转换而来的至
RDD[(String, List[Int])]
.
foldByKey
来执行这样的操作。或
reduceByKey
它使代码的语义变得不清楚,并引用@tim-peters “应该有一种——最好只有一种——明显的方法来做到这一点”[1]。
aggregateByKey
之间的区别和
combineByKey
与
reduceByKey
之间几乎相同和
foldByKey
所以对于一个列表来说,它主要是一个品味问题:
def merge_value(acc, x):
acc.append(x)
return acc
def merge_combiners(acc1, acc2):
acc1.extend(acc2)
return acc1
rdd = (sc.parallelize([("a", 7), ("b", 3), ("a", 8)])
.combineByKey(
lambda x: [x],
lambda u, v: u + [v],
lambda u1,u2: u1+u2))
groupByKey
尽管。与上面提供的简单实现相比,PySpark 实现明显更加优化。
groupByKey
的Python实现比朴素的按键组合明显更优化。您可以查看
Be Smart About groupByKey ,由我和
@eliasah 创建进行额外的讨论。
关于apache-spark - Apache Spark : What is the equivalent implementation of RDD. groupByKey() 使用 RDD.aggregateByKey()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31081563/
我需要一个正则表达式,它只会选择那些不以 .png 或 .css 等特定扩展名结尾的 URL 字符串。 我测试了以下内容: 1)这个使用负回顾: (? SetHandler "proxy:un
我似乎无法确切地掌握名称的等效性。我很确定我的结构已经下降。我的教授给出的一个例子是: Type TI=integer Type TTI=TI a=integer b=TTI f= ref
我最近为问题“A Regex that will never be matched by anything ”( my answer here ,请参阅更多信息)计时了一堆正则表达式。 然而,在我测试
Clojure 为 提供方法懒惰评估 (无限)序列中的值。有了这个,值只会在它们被实际消耗时计算。 一个重复元素的无限序列示例: (take 3 (repeat "Hello StackOverflo
如果我使用文本文件在 Solr/Lucene 中定义同义词,如下所示: foo, bar, goo abc, bar, xyz 字bar在两条线上。 这是否意味着 Solr 将所有术语都视为同义词,因
在 Xcode 中,当您设置键盘快捷键时,有一个很好的控件可以帮助您: 我觉得我可以通过扩展 NSTextField 来重现它,但我也觉得这可能是其他人以前做过的事情。我做了一些搜索,但没有找到任何结
我对汇编语言有点陌生,很难理解术语“字节等效”。 它用于以下上下文:- MOV 指令有时会引起歧义。例如,查看以下语句: MOV EBX, [MY_TABLE] ; Effective Addre
这是一个“软性问题”,因此,如果此发布地点不合适,请告诉我。 本质上,我想知道如何谈论在某种意义上“等效”而在另一些意义上“不同”的算法。 这是一个玩具示例。假设我们得到了一个长度为list的数字n的
我(在 Protege 中)定义了一个 Missing 类,它相当于 ((not (atHome value 30)) and (not (atWork value 30)))and (not (on
我正在处理一个烦人的数据库,其中一个字段包含真正应该存储在两个单独字段中的内容。因此该列存储的内容类似于“第一个字符串~@~第二个字符串”,其中“~@~”是分隔符。 (再说一次,我没有设计这个,我只是
在 Django 中,这两个是等价的吗? Cars.objects.exclude(brand='mercedes').exclude(year__lte=2000) 和 Cars.objects.e
此代码行选择任何类名不是“id”和“quantity”的 div 内的所有子输入:: $("div.item > div:not(.id,.quantity) > :input").live("key
在 Vue 1.x 中,我使用以下指令直接选择一个节点。 然后: this.$els.visibleColumns 是否有 Vue 2.x 方法来做到这一点? 最佳答案 当然,所以它已被 ref/$
我在underscore.js源码中看到了这段代码: if ((!a && b) || (a && !b)) return false; 这是否等同于以下内容? if (a ^ b) return f
我需要一些关于批处理文件中 grep -v Wildcard 和 grep -o 的等效代码的帮助。 这是我在 shell 中的代码。 result=`mysqlshow --user=$dbUser
我试图在 SQL 中找到等同于 IN\NOT 的 ElasticSearch 查询。 我知道我们可以使用带有多个 OR 的 QueryString 查询来获得相同的答案,但最终会得到很多 OR。 谁能
On a separate post , 我在帮忙George Edwards使用 BLE API 分解一些代码. 我很确定我发布的代码(使用分解模板)与原始代码相同。但是当 George 将它发送到
是否有办法“模仿”background-size:cover; 的行为? (参见 http://www.w3schools.com/cssref/playit.asp?filename=playcss
我正在使用 Qt。我需要直接向我的打印机写入一些文本。在 Windows 上,我可以使用 winapi OpenPrinter 和 WritePrinter 执行此操作,但我需要此代码才能在 linu
我搜索过并使用过 UIDevice.currentDevice().instancesRespondToSelector(Selector("userInterfaceIdiom")) 但对我不起作用
我是一名优秀的程序员,十分优秀!