專(zhuān)門(mén)做化妝的招聘網(wǎng)站品牌營(yíng)銷(xiāo)策略四種類(lèi)型
在之前的文章中,我們學(xué)習(xí)了如何在spark中使用RDD的filter,distinct,intersection三種方法。想了解的朋友可以查看這篇文章。同時(shí),希望我的文章能幫助到你,如果覺(jué)得我的文章寫(xiě)的不錯(cuò),請(qǐng)留下你寶貴的點(diǎn)贊,謝謝。
Spark-Scala語(yǔ)言實(shí)戰(zhàn)(9)-CSDN博客文章瀏覽閱讀927次,點(diǎn)贊25次,收藏18次。今天開(kāi)始的文章,我會(huì)帶給大家如何在spark的中使用我們的RDD方法,今天學(xué)習(xí)RDD方法中的filter,distinct,intersection三種方法,并進(jìn)行一代。希望我的文章能幫助到大家,也歡迎大家來(lái)我的文章下交流討論,共同進(jìn)步。https://blog.csdn.net/qq_49513817/article/details/137205627?今天的文章,我會(huì)繼續(xù)帶著大家如何在spark的中使用我們的RDD方法。今天學(xué)習(xí)RDD方法中的cartesian,subtract兩種方法。
目錄
一、知識(shí)回顧
二、RDD方法
1.cartesian
2.subtract
拓展-方法參數(shù)設(shè)置與笛卡爾積
1.方法參數(shù)設(shè)置
?a.cartesian方法
b.?subtract方法
2.笛卡爾積
一、知識(shí)回顧
?上一篇文章中我們學(xué)習(xí)了RDD的三種方法,分別是filter,distinct,intersection。
ilter()方法是一種轉(zhuǎn)換操作,用于過(guò)濾RDD中的元素。例如昨天的過(guò)濾偶數(shù)出來(lái)。
當(dāng)然,你也可以選擇過(guò)濾奇數(shù),可以過(guò)濾被3整除的數(shù),全憑自己所需
distinct方法是一種轉(zhuǎn)換操作,用于RDD的數(shù)據(jù)去重
去除我們的重復(fù)數(shù)據(jù),在一些特定場(chǎng)景,能讓我們的數(shù)據(jù)更簡(jiǎn)潔,更直觀
intersectio方法用于求出兩個(gè)RDD的共同元素?
現(xiàn)在,開(kāi)始今天的學(xué)習(xí)吧~?
二、RDD方法
1.cartesian
- cartesian()方法可將兩個(gè)集合的元素兩兩組合成一組,即求笛卡兒積。
- 創(chuàng)建兩個(gè)RDD,分別有3個(gè)元素,通過(guò)cartesian()方法求兩個(gè)RDD的笛卡兒積。
import org.apache.spark.{SparkConf, SparkContext}object p1 {def main(args: Array[String]): Unit = {val conf=new SparkConf().setMaster("local").setAppName("p2")val sc=new SparkContext(conf)val p1 = sc.parallelize(Seq(1, 2, 3))val p2 = sc.parallelize(Seq("A", "B", "C"))// 對(duì)兩個(gè)RDD執(zhí)行cartesian操作val pp = p1.cartesian(p2)val ppp = pp.collect()ppp.foreach { case (x, y) => println(s"($x, $y)") }}
}
?可以看到我我們創(chuàng)建了兩個(gè)集合為p1和p2,再使用cartesian進(jìn)行求笛卡爾積,最后已每個(gè)輸出為僅有x,y兩個(gè)元素的元組形式進(jìn)行遍歷輸出。
運(yùn)行代碼,看看結(jié)果
可以看到成功輸出了笛卡爾積?
2.subtract
- subtract()方法用于將前一個(gè)RDD中在后一個(gè)RDD出現(xiàn)的元素刪除,可以認(rèn)為是求補(bǔ)集的操作,返回值為前一個(gè)RDD去除與后一個(gè)RDD相同元素后的剩余值所組成的新的RDD。兩個(gè)RDD的順序會(huì)影響結(jié)果。
- 創(chuàng)建兩個(gè)RDD,分別為rdd1和rdd2,包含相同元素和不同元素,通過(guò)subtract()方法求rdd1和rdd2彼此的補(bǔ)集。
import org.apache.spark.{SparkConf, SparkContext}object p1 {def main(args: Array[String]): Unit = {val conf=new SparkConf().setMaster("local").setAppName("p2")val sc=new SparkContext(conf)val p1 = sc.parallelize(Seq(1, 2, 3, 4, 5))val p2 = sc.parallelize(Seq(3, 4, 5, 6, 7))// 對(duì)p1執(zhí)行subtract操作,移除p2中存在的元素val pp = p1.subtract(p2)val ppp = pp.collect()ppp.foreach(println)}
}
可以看到我們的代碼創(chuàng)建了一個(gè)p1與p2,它們中間有共同元素3,4,5,那么對(duì)p1使用?subtract方法移除與p2共同元素后,打印出來(lái)應(yīng)該只有1與2,現(xiàn)在我們運(yùn)行代碼看看是否與所預(yù)期一致。
可以看到成功輸出1,2,代碼有效,快去練習(xí)吧~?
拓展-方法參數(shù)設(shè)置與笛卡爾積
1.方法參數(shù)設(shè)置
?a.cartesian方法
參數(shù)/屬性 | 說(shuō)明 | 使用例子 | 不同參數(shù)/屬性的效果 |
---|---|---|---|
RDD2 | 另一個(gè)RDD,用于計(jì)算笛卡爾積 | RDD1.cartesian(RDD2) | 不同的RDD2會(huì)導(dǎo)致不同的笛卡爾積結(jié)果。笛卡爾積的大小是RDD1和RDD2大小的乘積。 |
隨著RDD1和RDD2的大小增加,笛卡爾積的結(jié)果集急劇增大。 | |||
合適的分區(qū)策略可以提高cartesian 操作的性能。 |
b.?subtract方法
參數(shù)/屬性 | 說(shuō)明 | 使用例子 | 不同參數(shù)/屬性的效果 |
---|---|---|---|
RDD2 | 從當(dāng)前RDD中去除與RDD2相同的元素 | RDD1.subtract(RDD2) | 不同的RDD2會(huì)導(dǎo)致從RDD1中去除的元素?cái)?shù)量和內(nèi)容不同。 |
numPartitions | (可選)結(jié)果RDD的分區(qū)數(shù)量 | RDD1.subtract(RDD2, numPartitions) | 如果指定,則控制結(jié)果RDD的分區(qū)數(shù)量,影響計(jì)算的并行度和性能。 |
如果不指定,通常使用默認(rèn)分區(qū)策略。 | |||
數(shù)據(jù)分布 | RDD中數(shù)據(jù)的分布情況 | 不均勻的數(shù)據(jù)分布可能導(dǎo)致某些分區(qū)上的計(jì)算任務(wù)比其他分區(qū)更重。 | |
優(yōu)化的數(shù)據(jù)分布可以提高subtract 操作的性能。 | |||
重復(fù)元素 | RDD中可能存在的重復(fù)元素 | subtract 操作不會(huì)特殊處理重復(fù)元素,它們會(huì)按照正常規(guī)則被去除或保留。 |
2.笛卡爾積
?笛卡爾積是數(shù)學(xué)術(shù)語(yǔ),又稱直積。假設(shè)集合A={a,b},集合B={0,1,2},則A和B的笛卡爾積為{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}??梢詳U(kuò)展到多個(gè)集合。類(lèi)似的,多個(gè)二元組集合的笛卡爾積是各集合中所有二元組的一個(gè)組合,組合的前提是各集合中的二元組數(shù)目相等。做笛卡爾積的兩個(gè)集合A和B中可以不含有重復(fù)元素,也可以包含重復(fù)元素。
在大數(shù)據(jù)中,笛卡爾積的作用主要體現(xiàn)在數(shù)據(jù)組合和擴(kuò)展方面。具體來(lái)說(shuō),當(dāng)需要對(duì)兩個(gè)或多個(gè)數(shù)據(jù)集進(jìn)行組合時(shí),可以使用笛卡爾積來(lái)生成所有可能的組合。這種組合方式在數(shù)據(jù)分析、數(shù)據(jù)挖掘以及機(jī)器學(xué)習(xí)等領(lǐng)域中非常有用,因?yàn)樗梢詭椭覀儎?chuàng)建更豐富的數(shù)據(jù)集,以便進(jìn)行更深入的分析和建模。