你好, 程序员, 我希望你们都做得很好。
在我之前的文章《 apache spark 的核心 api 简介》 (第一部分)中, 我提到了纯 rdd 的方法, 正如我承诺的那样, 将解释与多个示例片段配对 rdd 的功能或方法。所以就在这里!
要创建对 rdd, 请参考我以前的帖子。在该教程的帮助下, 您可以创建对 rdd (在这里, 我假设订单 pairrdd 是我的对 rdd, 它有一个标记 order_id
的键和一个值设置为) order
。
-
配对 rdd 核心 api
-
订单 pairrdd. join (其他 rdd)
-
此方法返回一个 rdd, 其中包含具有中匹配键的所有元素对
otherRDD
。默认联接的工作方式与 sql 中的内部联接相同。
ordersPairRdd.first() # (u'1', u'1,2013-07-25 00:00:00.0,11599,CLOSED') orderItemsPairRDD.first() # (u'1', u'1,1,957,1,299.98,299.98') ordersJoinOrderItems = ordersPairRdd.join(orderItemsPairRDD) # (u'1', (u'1,2013-07-25 00:00:00.0,11599,CLOSED', u'1,1,957,1,299.98,299.98'))
-
-
订单 pairrdd. 玩耍 (therrdd)
-
此方法在和上执行左外部
ordersPairRdd
联接otherRDD
。 -
假设
ordersPairRdd
有 (k, v) 和otherRDD
(k, w), 那么如果没有元素中otherRDD
的键叫 k, 则生成的 rdd 将具有 (k, (v, w)) 和 (k, (v, no))。
ordersLeftJoinOrderItems = ordersPairRdd.leftOuterJoin(orderItemsPairRDD) ordersLeftJoinOrderItems.first() # (u'35236', (u'35236,2014-02-27 00:00:00.0,3987,PENDING', u'87999,35236,365,1,59.99,59.99'))
-
-
订单 pairrdd. rightouterjoin (其他 rdd)
-
此方法在和上执行正确的外部联接.
ordersPairRdd
otherRDD
-
假设
ordersPairRdd
有 (k, v) 和otherRDD
(k, w), 那么如果没有元素中ordersPairRdd
的键叫 k, 则生成的 rdd 将具有 (k, (v, w)) 和 (k, (无, v))。
ordersRightJoinOrderItems = ordersPairRdd.rightOuterJoin(orderItemsPairRDD) ordersRightJoinOrderItems.first() # (u'35236', (u'35236,2014-02-27 00:00:00.0,3987,PENDING', u'87999,35236,365,1,59.99,59.99'))
-
-
命令 pairrdd. full outerjoin (其他 rdd)
-
此方法在和执行完整的外部联接.
ordersPairRdd
otherRDD
-
假设
ordersPairRdd
有 (k, votherRDD
) 和 (k, w) 和 (k, w), 那么生成的 rdd 将有 (k, (v, w)) 和 (k, (v, 无))otherRDD
, 如果没有元素在有键 k 和 (k, (无, v)), 如果没有元素inordersPairRdd
在有一个键称为 k。
ordersFullJoinOrderItems = ordersPairRdd.fullOuterJoin(orderItemsPairRDD) ordersFullJoinOrderItems.first() # (u'35236', (u'35236,2014-02-27 00:00:00.0,3987,PENDING', u'87999,35236,365,1,59.99,59.99'))
-
-
订单 pairrdd. 县 bykey ()
-
此方法用于计算每个键的元素数, 然后将结果作为字典返回到主
-
-
平行化 ([(“a”, 1)、(“b”、1)、(“a”, 1)) rdd. 县 bykey (). 项目 () # [(‘ a ‘, 2)、(‘ b ‘, 1)]
命令 pairrdd. group bykey ()
-
此方法将 rdd 中每个键的值分组为一个键。
-
在每个密钥上的聚合情况下, 使用
reduceByKey
并aggregateByKey
将提供比groupByKey
.
ordersPairRdd.groupByKey().mapValues(list).collect()
#[(u'18065', [u'18065,2013-11-13 00:00:00.0,5684,PROCESSING']), (u'34148', [u'34148,2014-02-20 00:00:00.0,10198,COMPLETE'])]
订单 pair-rdd. 减少 bykey (func)
-
此方法将在关联减少函数的帮助下合并每个键的值。
pairRdd = sc.parallelize([("a", 1), ("b", 1), ("a", 1)])
test = pairRdd.reduceByKey(lambda x, y: x+y)
test.collect()
# [('a', 2), ('b', 1)]
订单 pairrdd. 聚合 bykey (零值, seqfunc, combfunc)
-
根据spark 编程指南, 此函数使用给定的组合函数和中性的 “零值” 聚合每个键的值。此函数可以返回不同的结果类型, u, 然后返回此 rdd 中的值的类型, v。因此, 我们需要一个将 v 合并到您中的操作和一个合并两个 us 的操作。前一个操作用于合并分区中的值, 后一个操作用于在分区之间合并值。为了避免内存分配, 允许这两个函数修改并返回它们的第一个参数, 而不是创建一个新的 u。
pairRdd = sc.parallelize([("a", 1), ("b", 1), ("a", 1)])
pairRdd.aggregateByKey((0),lambda x,y: (x+y),lambda r1,r2: (r1+r2)).collect()
# [('a', 2), ('b', 1)]
订单接收 rd. 组合 bykey (createcombiner, mergevalue, mergecombiner)
-
此方法用于使用聚合函数的自定义集组合每个键的值。
-
例如, 如果 rdd 的类型 (k, v), 则此函数可能返回类型 (k, w) 的 rdd, 其中 v 和 w 可以是不同的类型。
-
createCombiner
-它把一个 v 变成了 w -
mergeValue
-将 v 合并为 w。 -
mergeCombiner
-把两个 w 合二为一
x = sc.parallelize([("a", 1), ("b", 1), ("a", 1)]) def add(a, b): return a + str(b) sorted(x.combineByKey(str, add, add).collect()) # [('a', '11'), ('b', '1')]
-
命令 pair-rd. sortbykey (升序 = truthy)
-
顾名思义, 此函数用于基于键对对 rdd 进行排序。
tmp = [('a', 1), ('b', 2), ('1', 3), ('d', 4), ('2', 5)]
sc.parallelize(tmp).sortByKey().first()
# ('1', 3)
tmp2 = [('Mary', 1), ('had', 2), ('a', 3), ('little', 4), ('lamb', 5)]
tmp2.extend([('whose', 6), ('fleece', 7), ('was', 8), ('white', 9)])
sc.parallelize(tmp2).sortByKey(True, 3, keyfunc=lambda k: k.lower()).collect()
# [('a', 3), ('fleece', 7), ('had', 2), ('lamb', 5),...('white', 9), ('whose', 6)]
这些都是对 rdd 的函数或方法, 即使用键: 值对。在我的下一篇文章中, 我将解释与多个示例片段配对 rdd 的功能或方法