← 返回蜂巢洞察

阿帕奇火花的核心 api 简介 (第二部分)

你好, 程序员, 我希望你们都做得很好。 在我之前的文章《 apache spa … Read More

Socrates

你好, 程序员, 我希望你们都做得很好。

在我之前的文章《 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, v otherRDD ) 和 (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 的功能或方法

    相关文章