Pyspark学习笔记(五)RDD操作(四)_RDD连接/集合操作

在这里插入图片描述


Pyspark学习笔记(五)RDD操作(四)_RDD连接/集合操作


# 前言 本篇博客讲的是RDD的连接/集合操作

1.join-连接

对应于SQL中常见的JOIN操作
菜鸟教程网关于SQL连接总结性资料
Pyspark中的连接函数要求定义键,因为连接的过程是基于共同的字段(键)来组合两个RDD中的记录,因此需要操作键值对RDD

rdd_1 = sc.parallelize([('USA', (1,2,3)), ('CHINA', (4,5,6)), ('RUSSIA', (7,8,9))])
rdd_2 = sc.parallelize([('UK', (3,3,3)), ('FRANCE', (7,7,7)), ('USA', (9,9,9))])

1.1. innerjoin-内连接

join(other, numPartitions)
官方文档:pyspark.RDD.join
内连接通常就被简称为连接,或者说平时说的连接其实指的是内连接。

rdd_join_test = rdd_1.join(rdd_2)
print(rdd_join_test.collect())
#output
[('USA', ((1,2,3), (9,9,9)))]

1.2. leftOuterJoin-左连接

leftOuterJoin(other, numPartitions)
官方文档:pyspark.RDD.leftOuterJoin
以“左侧”的RDD的key为基准,join上“右侧”的RDD的value, 如果在右侧RDD中找不到对应的key, 则返回 none

rdd_leftOuterJoin_test = rdd_1.leftOuterJoin(rdd_2)
print(rdd_leftOuterJoin_test.collect())
#output
[('USA', ((1,2,3), (9,9,9))), ('CHINA', ((4,5,6), None)), ('RUSSIA', ((7,8,9), None))]

1.3. rightOuterJoin-右连接

rightOuterJoin(other, numPartitions)
官方文档:pyspark.RDD.rightOuterJoin
以“右侧”的RDD的key为基准,join上“左侧”的RDD的value, 如果在左侧RDD中找不到对应的key, 则返回 none

rdd_rightOuterJoin_test = rdd_1.rightOuterJoin(rdd_2)
print(rdd_rightOuterJoin_test.collect())
#output
[('USA', ((1,2,3), (9,9,9))), ('UK', (None, (3,3,3))), ('FRANCE', (None, (7,7,7))]

1.4. fullOuterJoin-全连接

fullOuterJoin(other, numPartitions)
官方文档:pyspark.RDD.fullOuterJoin
两个RDD中各自包含的key为基准,能找到共同的Key,则返回两个RDD的值,找不到就各自返回各自的值,并以none****填充缺失的值

rdd_fullOuterJoin_test = rdd_1.fullOuterJoin(rdd_2)
print(rdd_fullOuterJoin_test.collect())
#output
[('USA', ((1,2,3), (9,9,9))), ('CHINA', ((4,5,6), None)), ('RUSSIA', ((7,8,9), None)), ('UK', (None, (3,3,3))), ('FRANCE', (None, (7,7,7))]

1.5 cogroup

cogroup(other, numPartitions)
官方文档:pyspark.RDD.cogroup
实现过程和全连接其实差不多,就是数据的表现形式有点区别
生成的并不是一个新的键值对RDD,而是一个可迭代的对象
rdd_cogroup_test = rdd_1.cogroup(rdd_2)
print(rdd_cogroup_test.collect())
#会发现直接输出的话,输出的是可迭代对象的地址

[('USA', (<pyspark.resultiterable.ResultIterable at xxxxxxxxx>, <pyspark.resultiterable.ResultIterable at xxxxxxxxx>)), ..., ]
#因为该函数输出的格式就是: RDD[Tuple[K, Tuple[ResultIterable[V], ResultIterable[U]]]]

想要看明文的结果的话,可以如下

print((k, tuple(map(list, v))) for k, v in list(rdd_cogroup_test.collect()))
[('USA', ((1,2,3), (9,9,9))), ('CHINA', ([(4,5,6)], [])), ('RUSSIA', ([(7,8,9)], [])), ('UK', ([], [(3,3,3)])), ('FRANCE', ([], [(7,7,7)])]

1.6 cartesian

cartesian(other)
官方文档:pyspark.RDD.cartesian
这个就是笛卡尔积,也被称为交叉连接,它会根据两个RDD的所有条目来进行所有可能的组合。
要注意这个操作可能会产生大量的数据,一般还是不要轻易使用。

2.Union-集合操作

2.1 union

union(other)
官方文档:pyspark.RDD.union
转化操作union()把一个RDD追加到另一个RDD后面,两个RDD的结构并不一定要相同(即不一定列数要相同),并且union并不会过滤重复的条目。

2.2 intersection

intersection(other)
官方文档:pyspark.RDD.intersection
返回两个RDD中共有的元素,要注意,和 join 其实并不一样,join操作只是要求 key一样,而intersection 并不要求有key,是要求两边的条目必须是一模一样,即每个字段(列)上的数据都要求能保持一致,即【完全一样】的两行条目,才能返回。

2.3 subtract

subtract(other, numPartitions)
官方文档:pyspark.RDD.subtract
这个名字就说明是在做“减法”,即第一个RDD中的元素 减去 第二个RDD中的元素,返回第一个RDD中有,但第二个RDD中没有的元素。

2.4 subtractByKey

subtractByKey(other, numPartitions)
官方文档:pyspark.RDD.subtractByKey
该操作和上面的subtract类似,只不过这里是以Key作为参照了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用pyspark库时,出现以下错误的原因是什么:Traceback (most recent call last): File "warn_first.py", line 435, in <module> fluence_data_history =spark_sql_test(fluence_sql) File "warn_first.py", line 347, in spark_sql_test sc = SparkContext(conf=conf) File "/data13/yarn/nm2/usercache/target_hive2ck/appcache/application_1683620905143_2728366/container_e4080_1683620905143_2728366_06_000001/pyspark.zip/pyspark/context.py", line 118, in init File "/data13/yarn/nm2/usercache/target_hive2ck/appcache/application_1683620905143_2728366/container_e4080_1683620905143_2728366_06_000001/pyspark.zip/pyspark/context.py", line 180, in _do_init File "/data13/yarn/nm2/usercache/target_hive2ck/appcache/application_1683620905143_2728366/container_e4080_1683620905143_2728366_06_000001/pyspark.zip/pyspark/context.py", line 288, in _initialize_context File "/data13/yarn/nm2/usercache/target_hive2ck/appcache/application_1683620905143_2728366/container_e4080_1683620905143_2728366_06_000001/py4j-0.10.7-src.zip/py4j/java_gateway.py", line 1525, in call File "/data13/yarn/nm2/usercache/target_hive2ck/appcache/application_1683620905143_2728366/container_e4080_1683620905143_2728366_06_000001/pyspark.zip/pyspark/sql/utils.py", line 63, in deco File "/data13/yarn/nm2/usercache/target_hive2ck/appcache/application_1683620905143_2728366/container_e4080_1683620905143_2728366_06_000001/py4j-0.10.7-src.zip/py4j/protocol.py", line 328, in get_return_value py4j.protocol.Py4JJavaError: An error occurred while calling None.org.apache.spark.api.java.JavaSparkContext. : java.lang.IllegalStateException: Promise already completed.
06-14

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值