版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
許斌/0181932025.11.18新開發(fā)電商用戶行為數(shù)據(jù)分析
學完本課程后,您將可以:了解RDD的概念和特點掌握RDD操作的分類掌握SparkShell環(huán)境的使用能在SparkShell環(huán)境中進行實踐操作能使用RDD對數(shù)據(jù)進行預(yù)處理能使用RDD對數(shù)據(jù)進行統(tǒng)計與需求功能實現(xiàn)01認識RDD02RDD操作實踐03使用RDD實現(xiàn)電商用戶行為分析401認識RDDRDD的概念RDD的全稱是ResilientDistributedDataset(彈性分布式數(shù)據(jù)集),是Spark中最基本的數(shù)據(jù)結(jié)構(gòu)之一(可以簡單地把RDD理解成一個提供了很多操作接口的數(shù)據(jù)集合)Resilient(彈性的)Distributed(分布式的)Dataset(數(shù)據(jù)集)包括存儲和計算兩個方面。在存儲方面,RDD中的數(shù)據(jù)可以保存在內(nèi)存中,當內(nèi)存不足時也可以保存在磁盤上;在計算方面,RDD具有自動容錯的特點,當運算過程中出現(xiàn)異常導(dǎo)致Partition數(shù)據(jù)丟失或運算失敗時,可以根據(jù)Lineage(血統(tǒng))關(guān)系對數(shù)據(jù)進行重建同樣包括存儲和計算兩個方面。RDD的數(shù)據(jù)元素是分布式存儲的,同時其運算方式也是分布式的RDD本質(zhì)上是一個存放元素的分布式數(shù)據(jù)集合RDD的特點RDD具有分布式計算、容錯性、數(shù)據(jù)可讀性、內(nèi)存計算、優(yōu)化執(zhí)行計劃和支持多種數(shù)據(jù)源等特點,可以幫助大數(shù)據(jù)處理更加高效和靈活分布式計算RDD可以在集群中的多個節(jié)點上進行分區(qū)和并行計算,利用集群的計算資源進行高效的數(shù)據(jù)處理容錯性RDD通過記錄轉(zhuǎn)換操作的血統(tǒng)(lineage)信息,可以在節(jié)點故障時重新計算丟失的部分,保證計算結(jié)果的可靠性數(shù)據(jù)可讀性RDD提供了高級的數(shù)據(jù)操作接口,如map、filter、reduce等,使得數(shù)據(jù)的處理更加靈活和高效內(nèi)存計算RDD可以將數(shù)據(jù)緩存在內(nèi)存中,通過內(nèi)存計算來加速數(shù)據(jù)的處理,大幅提升計算性能優(yōu)化執(zhí)行計劃Spark可以通過優(yōu)化執(zhí)行計劃來減少數(shù)據(jù)的傳輸和計算開銷,提高作業(yè)執(zhí)行效率支持多種數(shù)據(jù)源RDD可以從多種數(shù)據(jù)源中讀取數(shù)據(jù),如HDFS、本地文件系統(tǒng)、數(shù)據(jù)庫等,方便靈活地處理不同類型的數(shù)據(jù)RDD操作分類RDD操作指的是Spark中對RDD進行操作(使用Spark高效地處理大規(guī)模數(shù)據(jù),都離不開RDD操作)轉(zhuǎn)換操作(轉(zhuǎn)換算子)行動操作(行動算子)對RDD進行轉(zhuǎn)換并生成新的RDD,而不改變原有的RDD。轉(zhuǎn)換操作是惰性求值的,即在調(diào)用轉(zhuǎn)換操作時,并不會立即執(zhí)行計算,而是記錄下轉(zhuǎn)換操作的邏輯,并在執(zhí)行行動操作時才進行實際計算。轉(zhuǎn)換操作返回的是一個新的RDD,可以進行鏈式調(diào)用對RDD執(zhí)行計算并返回結(jié)果。行動操作會觸發(fā)RDD的計算過程,從而產(chǎn)生實際的結(jié)果或副作用。行動操作會立即執(zhí)行,返回一個具體的結(jié)果,而不是一個新的RDD常用的轉(zhuǎn)換操作轉(zhuǎn)換操作(轉(zhuǎn)換算子)含義map(func)返回一個新的RDD,該RDD由每一個輸入元素經(jīng)過func函數(shù)轉(zhuǎn)換后組成filter(func)返回一個新的RDD,該RDD由經(jīng)過func函數(shù)計算后返回值為true的輸入元素組成flatMap(func)類似于map,但是每一個輸入元素可以被映射為0或多個輸出元素(所以func應(yīng)該返回一個序列,而不是單一元素)mapPartitions(func)類似于map,但獨立地在RDD的每一個分片上運行,因此在類型為T的RDD上運行時,func的函數(shù)類型必須是Iterator[T]=>Iterator[U]mapPartitionsWithIndex(func)類似于mapPartitions,但func帶有一個整數(shù)參數(shù)表示分片的索引值,因此在類型為T的RDD上運行時,func的函數(shù)類型必須是(Int,Interator[T])=>Iterator[U]常用的轉(zhuǎn)換操作轉(zhuǎn)換操作(轉(zhuǎn)換算子)含義union(otherDataset)對源RDD和參數(shù)RDD求并集后返回一個新的RDDintersection(otherDataset)對源RDD和參數(shù)RDD求交集后返回一個新的RDDdistinct([numTasks]))對源RDD進行去重后返回一個新的RDDgroupByKey([numTasks])在一個(K,V)的RDD上調(diào)用,返回一個(K,Iterator[V])的RDDreduceByKey(func,[numTasks])在一個(K,V)的RDD上調(diào)用,返回一個(K,V)的RDD,使用指定的reduce函數(shù),將相同key的值聚合到一起,與groupByKey類似,reduce任務(wù)的個數(shù)可以通過第二個可選的參數(shù)來設(shè)置常用的轉(zhuǎn)換操作轉(zhuǎn)換操作(轉(zhuǎn)換算子)含義sortByKey([ascending],[numTasks])在一個(K,V)的RDD上調(diào)用,K必須實現(xiàn)Ordered接口,返回一個按照key進行排序的(K,V)的RDDsortBy(func,[ascending],[numTasks])與sortByKey類似,但是更靈活join(otherDataset,[numTasks])在類型為(K,V)和(K,W)的RDD上調(diào)用,返回一個相同key對應(yīng)的所有元素對在一起的(K,(V,W))的RDDcogroup(otherDataset,[numTasks])在類型為(K,V)和(K,W)的RDD上調(diào)用,返回一個(K,(Iterable<V>,Iterable<W>))類型的RDDcoalesce(numPartitions) 減少RDD的分區(qū)數(shù)到指定值常用的轉(zhuǎn)換操作轉(zhuǎn)換操作(轉(zhuǎn)換算子)含義repartition(numPartitions)重新給RDD分區(qū)repartitionAndSortWithinPartitions(partitioner)重新給RDD分區(qū),并且每個分區(qū)內(nèi)以記錄的key排序常用的行動操作行動操作(行動算子)含義reduce(func)reduce將RDD中元素前兩個傳給輸入函數(shù),產(chǎn)生一個新的return值,新產(chǎn)生的return值與RDD中下一個元素(第三個元素)組成兩個元素,再被傳給輸入函數(shù),直到最后只有一個值為止collect()在驅(qū)動程序中,以數(shù)組的形式返回數(shù)據(jù)集的所有元素count()返回RDD的元素個數(shù)first()返回RDD的第一個元素(類似于take函數(shù))take(n)返回一個由數(shù)據(jù)集的前n個元素組成的數(shù)組常用的行動操作行動操作(行動算子)含義takeOrdered(n,
[ordering])返回自然順序或者自定義順序的前n個元素saveAsTextFile(path)將數(shù)據(jù)集的元素以textfile的形式保存到HDFS文件系統(tǒng)或者其他支持的文件系統(tǒng),對于每個元素,Spark將會調(diào)用toString方法,將它轉(zhuǎn)換為文件中的文本saveAsSequenceFile(path)
()將數(shù)據(jù)集中的元素以Hadoopsequencefile的格式保存到指定的目錄下,可以使HDFS或者其他Hadoop支持的文件系統(tǒng)saveAsObjectFile(path)
將數(shù)據(jù)集的元素,以Java序列化的方式保存到指定的目錄下countByKey()針對(K,V)類型的RDD,返回一個(K,Int)的map,表示每一個key對應(yīng)的元素個數(shù)常用的行動操作行動操作(行動算子)含義countByValue()針對RDD中的元素,返回一個(元素,計數(shù))的map,表示每一個元素在RDD中出現(xiàn)的次數(shù)foreach(func)在數(shù)據(jù)集的每一個元素上,運行函數(shù)funcforeachPartition(func)在數(shù)據(jù)集的每一個分區(qū)上,運行函數(shù)func(多選)
以下是RDD操作分類?(
)轉(zhuǎn)換操作計算操作行動操作存儲操作
RDD有哪些特點?如何理解?
講解了RDD的概念講解了RDD的特點講解了操作分類(轉(zhuǎn)換操作和動作操作)講解了常見轉(zhuǎn)換操作和常見動作操作1802RDD操作實踐SparkShell介紹SparkShell是一個交互式編程環(huán)境,可以幫助人們更好地理解Spark程序開發(fā)。使用SparkShell時,可以輸入一條語句并立即執(zhí)行它,而不必等到整個程序運行完畢。這種交互式編程環(huán)境稱為REPL(Read-Eval-PrintLoop,交互式解釋器),它可以即時查看中間結(jié)果并對程序進行修改,因此SparkShell也常用于測試場景SparkShell支持Scala、Python和R語言語言進入SparkShell命令Scalaspark-shellPythonpysparkRsparkR進入與退出SparkShell環(huán)境要進入SparkShell環(huán)境,可以直接進入Spark的安裝路徑,然后執(zhí)行bin目錄下對應(yīng)語言的命令即可./bin/spark-shell進入SparkShell命令(Scala)退出SparkShell命令(Scala)Ctrl+D:quit方式一方式二SparkShell參數(shù)介紹-master參數(shù)指定Spark集群的主節(jié)點URL--master<MASTER_URL>:local:在本地運行Spark,使用單個線程,在本機執(zhí)行一些測試代碼時可使用本模式local[N]:在本地運行Spark,使用N個線程local[*]:默認為此種方式。在本地運行Spark,使用所有可用的線程spark://HOST:PORT:連接到指定的Spark主節(jié)點mesos://HOST:PORT:連接到指定的Mesos主節(jié)點yarn:連接到Y(jié)ARN集群k8s://https://HOST:PORT:連接到K8S集群SparkShell參數(shù)介紹-deploy-mode參數(shù)指定應(yīng)用程序的部署模式--deploy-mode<DEPLOY_MODE>:client:默認為此種方式(在客戶端模式下運行應(yīng)用程序)cluster:在集群模式下運行應(yīng)用程序SparkShell參數(shù)介紹-其他參數(shù)--class<CLASS_NAME>:指定要運行的主類--name<APP_NAME>:指定應(yīng)用程序的名稱--jars<JARS>:指定要包含在運行時類路徑中的JAR文件路徑,多個JAR文件可以用逗號分隔--py-files<PY_FILES>:指定要包含在Python運行時環(huán)境中的輔助文件路徑,多個文件可以用逗號分隔--conf<PROP=VALUE>:設(shè)置Spark配置屬性。例如--confspark.executor.memory=4g設(shè)置執(zhí)行程序的內(nèi)存為4GB--properties-file<FILE>:從指定的屬性文件中讀取配置屬性SparkShell參數(shù)介紹-其他參數(shù)--driver-memory<MEM>:指定驅(qū)動程序使用的內(nèi)存量,默認是1024M--executor-memory<MEM>:指定executor使用的內(nèi)存量,默認是1G--total-executor-cores<NUM>:指定集群中executor的總核心數(shù)--executor-cores<NUM>:指定每個executor使用的核心數(shù)--num-executors<NUM>:指定要啟動的executor數(shù)量SparkShell示例進入Spark的安裝路徑,執(zhí)行以下命令:./bin/spark-shell--masterspark://master:7077為Spark集群主節(jié)點名此時打開瀏覽器,輸入
http://master:8080/創(chuàng)建RDD的4種方式創(chuàng)建RDD由序列或列表創(chuàng)建RDD,使用parallelize方法從本地文件系統(tǒng)或HDFS中讀取數(shù)據(jù)創(chuàng)建RDD由已有的RDD進行操作創(chuàng)建新的RDD由已有的DataFrame或DataSet生成新的RDD常用轉(zhuǎn)換操作實踐-map(func)單例對象valrdd1=sc.parallelize(List(5,6,4,7,3,8,2,9,1,10))valrdd2=rdd1.map(_*2)rdd2.collect()map(func)操作將rdd1中的每個元素乘以2,生成了一個新的RDDrdd2(輸出結(jié)果是rdd2中的所有元素)res1:Array[Int]=Array(10,12,8,14,6,16,4,18,2,20)常用轉(zhuǎn)換操作實踐-filter(func)單例對象valrdd3=rdd2.filter(_>=5)rdd3.collect()filter(func)操作從rdd2中篩選出大于等于5的元素,生成了一個新的RDDrdd3(輸出結(jié)果是rdd3中的所有元素)res2:Array[Int]=Array(10,12,8,14,6,16,18,20)常用轉(zhuǎn)換操作實踐-flatMap(func)單例對象valrdd1=sc.parallelize(List("HelloWorld","Sparkisawesome"))valrdd4=rdd1.flatMap(_.split(""))rdd4.collect()flatMap(func)操作將rdd1中的每個元素按空格拆分成多個單詞,并生成一個包含所有單詞的新RDDrdd4(輸出結(jié)果是rdd4中的所有元素)res3:Array[String]=Array(Hello,World,Spark,is,awesome)常用轉(zhuǎn)換操作實踐-union(otherDataset)單例對象valrdd1=sc.parallelize(List(1,2,3))valrdd2=sc.parallelize(List(4,5,6))valrdd5=rdd1.union(rdd2)rdd5.collect()union(otherDataset)操作將rdd1和rdd2兩個RDD進行合并,并生成一個包含所有元素的新RDDrdd5(輸出結(jié)果是rdd5中的所有元素)res4:Array[Int]=Array(1,2,3,4,5,6)常用轉(zhuǎn)換操作實踐-groupByKey([numTasks])單例對象valrdd1=sc.parallelize(List(("apple",1),("banana",2),("apple",3)))valrdd6=rdd1.groupByKey()rdd6.collect()groupByKey([numTasks])操作將rdd1中的元素按鍵進行分組,并生成一個包含每個鍵及其對應(yīng)值的迭代器的新RDDrdd6(輸出結(jié)果是rdd6中的所有鍵值對)res5:Array[(String,Iterable[Int])]=Array((banana,CompactBuffer(2)),(apple,CompactBuffer(1,3)))常用轉(zhuǎn)換操作實踐-reduceByKey(func,[numTasks])單例對象valrdd7=rdd1.reduceByKey(_+_)rdd7.collect()reduceByKey(func,[numTasks])操作將rdd1中的元素按鍵進行分組,并對每個鍵對應(yīng)的值進行歸約(使用給定的函數(shù)func)(輸出結(jié)果是每個鍵和對應(yīng)的歸約結(jié)果)res6:Array[(String,Int)]=Array((banana,2),(apple,4))常用轉(zhuǎn)換操作實踐-sortByKey([ascending],[numTasks])單例對象valrdd1=sc.parallelize(List(("banana",1),("cherry",2),("apple",3)))valrdd8=rdd1.sortByKey()rdd8.collect()sortByKey([ascending],[numTasks])操作按鍵對rdd1中的元素進行排序,并生成一個按鍵排序好的新RDDrdd8(輸出結(jié)果是rdd8中的所有鍵值對)res7:Array[(String,Int)]=Array((apple,3),(banana,1),(cherry,2))常用轉(zhuǎn)換操作實踐-join(otherDataset,[numTasks])單例對象valrdd1=sc.parallelize(List(("apple",1),("banana",2),("cherry",3)))valrdd2=sc.parallelize(List(("apple","red"),("banana","yellow")))valrdd9=rdd1.join(rdd2)rdd9.collect()join(otherDataset,[numTasks])操作將rdd1和rdd2兩個RDD按鍵進行連接,并生成一個包含每個鍵及其對應(yīng)值的元組的新RDDrdd9(輸出結(jié)果是rdd9中所有鍵值對)res8:Array[(String,(Int,String))]=Array((banana,(2,yellow)),(apple,(1,red)))常用轉(zhuǎn)換操作實踐-repartition(numPartitions)單例對象valrdd1=sc.parallelize(List(1,2,3,4,5,6,7,8,9,10))valrdd10=rdd1.repartition(3)rdd10.collect()repartition(numPartitions)操作將rdd1中的數(shù)據(jù)重新分區(qū)為指定數(shù)量的分區(qū),并生成一個重新分區(qū)后的新RDDrdd10(輸出結(jié)果是rdd10中的所有元素)res9:Array[Int]=Array(1,4,7,9,10,2,3,5,6,8)常用行動操作實踐-reduce(func)單例對象valrdd1=sc.parallelize(List(1,2,3,4,5))valrdd2=rdd1.reduce(_+_)reduce(func)操作將RDD中的元素按照指定的二元運算符進行聚合(初始的RDDrdd1包含了整數(shù)1到5,reduce操作將這些整數(shù)相加,最終得到的結(jié)果是15)valrdd2:Int=15常用行動操作實踐-collect()單例對象valresult=rdd1.collect()collect()操作將RDD的所有元素作為數(shù)組或列表返回給驅(qū)動程序,其不保證結(jié)果數(shù)組中的元素按任何特定順序排列,并且如果RDD很大,則數(shù)組可能無法容納在內(nèi)存中valresult:Array[Int]=Array(1,2,3,4,5)常用行動操作實踐-count()單例對象valcount=rdd1.count()count()操作將RDD中的元素數(shù)量進行返回,count()操作的結(jié)果是一個Long值,表示RDD中的元素數(shù)量valcount:Long=5常用行動操作實踐-first()單例對象valfirst_element=rdd1.first()first()操作將返回RDD的第一個元素,返回值的類型與RDD中元素的類型相同。已知rdd1的元素為1、2、3、4和5,調(diào)用first()操作,返回并打印第一個元素1。valfirst_element:Int=1常用行動操作實踐-take(n)單例對象valtop3=rdd1.take(3)first()操作與take(1)操作類似,但返回類型有所不同。first()操作返回單個元素,而take(1)操作返回包含單個元素的列表valtop3:Array[Int]=Array(1,2,3)常用行動操作實踐-saveAsTextFile(path)單例對象rdd1.saveAsTextFile("file:///root/datas/rdd1")saveAsTextFile(path)是Spark中用于將RDD保存為文本文件的方法執(zhí)行之后,可以看到本地/root/datas路徑下,新生成了一個rdd1文件夾常用行動操作實踐-countByKey()單例對象valrdd=sc.parallelize(List(("apple",3),("banana",2),("orange",4),("apple",1),("banana",1),("apple",1)))valresult=rdd.countByKey()countByKey()操作可以用于統(tǒng)計(K,V)型RDD中每個Key出現(xiàn)的個數(shù)valresult:scala.collection.Map[String,Long]=Map(orange->1,apple->3,banana->2)常用行動操作實踐-countByValue()單例對象valrdd1=sc.parallelize(List("apple","banana","apple","orange","banana","apple"))valcountRDD=rdd1.countByValue()countByValue()操作可以返回一個Map,其中Key是字符串類型,值Value是長整型valcountRDD:scala.collection.Map[String,Long]=Map(orange->1,apple->3,banana->2)常用行動操作實踐-foreach(func)單例對象valrdd=sc.parallelize(List(1,2,3,4,5))rdd.foreach(x=>println(x*x))foreach(func)操作可以用于對RDD中的每個元素應(yīng)用一個函數(shù)1169425轉(zhuǎn)換操作(轉(zhuǎn)換算子)和行動操作(行動算子)有何區(qū)別?
你能說出5個轉(zhuǎn)換操作(轉(zhuǎn)換算子)和5個行動操作(行動算子)嗎?講解了
SparkShell環(huán)境介紹創(chuàng)建RDD的方式講解常用轉(zhuǎn)換操作實踐講解常用行動操作實踐4803使用RDD實現(xiàn)電商用戶行為分析電商行為數(shù)據(jù)簡介1,2268318,2520377,pv2333346,2520771,pv2576651,149192,pv3830808,4181361,pv4365585,2520377,pv4606018,2735466,pv230380,411153,pv3827899,2920476,pv3745169,2891509,pv1531036,2920476,pv,1511733732字段說明用戶ID每條日志均有對應(yīng)的用戶ID,一個用戶ID表示一個用戶商品ID每條日志均有對應(yīng)的商品ID商品類目ID每個商品所屬的類目ID行為類型指每條日志中用戶所對應(yīng)商品的行為類型(包括瀏覽、購買、加購商品、收藏商品等)時間戳行為發(fā)生的時間戳日志數(shù)據(jù)集中行為類型一共有四種類型:pv:商品詳情頁的PV(pageview,頁面瀏覽量),等同于點擊buy:購買商品cart:將商品加入購物車fav:收藏商品功能需求分析需求一:用戶行為統(tǒng)計需求二:商品流行度分析需求三:活躍時間分析需求四:用戶行為轉(zhuǎn)化漏斗模型通過對每個用戶的行為次數(shù)進行統(tǒng)計,可以了解哪些用戶在平臺上最活躍,從而可以針對這些用戶進行更精準的營銷活動通過找出被用戶行為涉及最多的前10個商品,可以了解哪些商品最受用戶歡迎,從而可以針對這些商品進行更精準的推薦通過分析用戶的活躍時間,可以了解用戶在哪個時間段最活躍,從而可以在這個時間段內(nèi)進行更精準的推送通過分析用戶從瀏覽到收藏,再到加入購物車,再到購買的轉(zhuǎn)化率,可以了解用戶的購買意愿,從而可以針對轉(zhuǎn)化率低的環(huán)節(jié)進行優(yōu)化需求實現(xiàn)思路分析-用戶行為分析(需求一)用戶行為分析統(tǒng)計每個用戶的總行為次數(shù)通過
map
函數(shù)將每一行數(shù)據(jù)的用戶ID(即第0個字段)提取出來,使用
countByValue
函數(shù)統(tǒng)計每個用戶ID出現(xiàn)的次數(shù),即用戶的總行為次數(shù)需求實現(xiàn)思路分析-商品流行度分析(需求二)商品流行度分析找出被用戶行為涉及最多的前10個商品使用map函數(shù)提取出每一行數(shù)據(jù)的商品ID(即第1個字段)使用countByValue函數(shù)統(tǒng)計每個商品ID出現(xiàn)的次數(shù)將結(jié)果轉(zhuǎn)換為序列并按照商品被涉及的次數(shù)降序排序取前10個需求實現(xiàn)思路分析-活躍時間分析(需求三)活躍時間分析分析用戶的活躍時間(例如可以統(tǒng)計在哪個時段用戶的行為最活躍)使用map函數(shù)提取出每一行數(shù)據(jù)的時間戳,并將其轉(zhuǎn)換為小時格式使用countByValue函數(shù)統(tǒng)計每個小時出現(xiàn)的次數(shù)將結(jié)果轉(zhuǎn)換為序列并按照次數(shù)降序排序需求實現(xiàn)思路分析-用戶行為轉(zhuǎn)化漏斗模型(需求四)用戶行為轉(zhuǎn)化漏斗模型分析用戶從瀏覽到收藏,再到加入購物車,再到購買的轉(zhuǎn)化率使用map函數(shù)提取出每一行數(shù)據(jù)的行為類型使用countByValue函數(shù)統(tǒng)計每種行為類型出現(xiàn)的次數(shù)計算從瀏覽到加入購物車的轉(zhuǎn)化率(即購物車行為的次數(shù)除以瀏覽行為的次數(shù),加入購物車到購買的轉(zhuǎn)化率也是類似的操作)數(shù)據(jù)預(yù)處理-缺失值處理缺失值處理無關(guān)特征過濾由于行為類型數(shù)據(jù)對于分析的重要性,需要將存在缺失值的行為類型數(shù)據(jù)行進行排除可以通過檢查每一行的數(shù)據(jù)是否包含行為類型字段,并將缺失該字段的行刪除或進行填充操作來實現(xiàn)//過濾掉行為類型為空的行valrddFiltered=rdd.filter(line=>{valcolumns=line.split(",")columns(3)!=null&&columns(3).length>0})數(shù)據(jù)預(yù)處理-無關(guān)特征過濾無關(guān)特征過濾根據(jù)需求分析,當前所需實現(xiàn)的功能與商品類目無關(guān)為了提升計算效率和減少噪聲影響,可以過濾掉商品類目ID字段可以通過刪除或忽略該字段所在的列來實現(xiàn)無關(guān)特征過濾//過濾掉商品類別ID這一列valrddFinal=rddFiltered.map(line=>{valcolumns=line.split(",")columns.take(2).mkString(",")+","+columns.drop(3).mkString(",")})功能需求實現(xiàn)-統(tǒng)計每個用戶的總行為次數(shù)(需求一)統(tǒng)計每個用戶的總行為次數(shù)valuserBehaviorCount=rddFinal.map(_.split(",")(0)).countByValue()rddFinal.map(_.split(",")(0)):指將rddFinal中的每一行數(shù)據(jù)按照逗號進行分割,然后取出第一個字段,即用戶IDcountByValue()函數(shù):是對RDD中的元素進行計數(shù),返回每一個元素在RDD中出現(xiàn)的次數(shù)。本示例中,元素為用戶ID,所以countByValue()函數(shù)返回的結(jié)果就是每個用戶ID出現(xiàn)的次數(shù),即每個用戶的總行為次數(shù)功能需求實現(xiàn)-統(tǒng)計每個用戶的總行為次數(shù)排序統(tǒng)計每個用戶的總行為次數(shù)排序valsortedUserBehaviorRDD=userBehaviorCount.toList.sortWith((a,b)=>b._2<a._2)sortWith函數(shù):對轉(zhuǎn)換后的列表進行排序,其接受一個比較函數(shù)作為參數(shù)在本示例中,比較函數(shù)為匿名函數(shù)“(a,b)=>b._2<a._2”,其作用是比較兩個元素(即列表中的兩個鍵值對)的值(即用戶的行為次數(shù)),并按照降序排列。功能需求實現(xiàn)-取前5名用戶的總行為次數(shù)用戶取前5名用戶的總行為次數(shù)用戶valtop5UserBehaviorCount=sortedUserBehaviorRDD.take(5)可知用戶ID為1000040、1000417、1000228、1000436、1000398的這5位用戶在電商平臺上最活躍功能需求實現(xiàn)-找出被用戶行為涉及最多的前10個商品(需求二)找出被用戶行為涉及最多的前10個商品valtop10Products=rddFinal.map(_.split(",")(1)).countByValue().toSeq.sortBy(-_._2).take(10)rddFinal.map(_.split(",")(1)):指取出第二個字段,即商品ID,然后統(tǒng)計每個商品ID出現(xiàn)的次數(shù)將結(jié)果轉(zhuǎn)換為序列(Seq),接著按照商品ID出現(xiàn)的次數(shù)進行降序排序,并取前10個出現(xiàn)次數(shù)最多的商品ID在本示例中,sortBy(-_._2)表示使用sortBy函數(shù)對序列進行排序,參數(shù)“-_._2”中的“_._2”表示按元素的第二個字段(即出現(xiàn)的次數(shù))進行排序,負號(“-”)表示降序排序功能需求實現(xiàn)-分析用戶的活躍時間(需求三)分析用戶的活躍時間valactiveHours=rd
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 天然氣管道施工操作流程及安全規(guī)范
- 傳統(tǒng)艾灸技術(shù)現(xiàn)代應(yīng)用案例
- 現(xiàn)代化除塵技術(shù)方案設(shè)計與應(yīng)用
- 建筑項目造價控制及風險管理方案
- 制造企業(yè)生產(chǎn)安全管理細則
- 公司財務(wù)報銷標準操作流程
- 企業(yè)新員工入職培訓(xùn)教材及方案
- 智能客服系統(tǒng)在電信行業(yè)的應(yīng)用案例
- 研學旅行安全管理方案范本
- 量子光譜分析中的波粒二象性-洞察及研究
- 設(shè)備日常維護保養(yǎng)培訓(xùn)課件
- 生活物資保障指南解讀
- 2025年浙江省委黨校在職研究生招生考試(社會主義市場經(jīng)濟)歷年參考題庫含答案詳解(5卷)
- DB3704∕T0052-2024 公園城市建設(shè)評價規(guī)范
- 采購領(lǐng)域廉潔培訓(xùn)課件
- 公司股東入股合作協(xié)議書
- 2025年中國化妝品注塑件市場調(diào)查研究報告
- 小兒藥浴治療
- 保險實務(wù)課程設(shè)計
- 物業(yè)管理公司管理目標標準
- 2023年重慶巴南區(qū)重點中學指標到校數(shù)學試卷真題(答案詳解)
評論
0/150
提交評論