更新時(shí)間:2022年03月07日18時(shí)36分 來源:傳智教育 瀏覽次數(shù):
Spark RDD 編程的程序入口對象是SparkContext對象(不論何種編程語言)。只有構(gòu)建出SparkContext, 基于它才能執(zhí)行后續(xù)的API調(diào)用和計(jì)算 。本質(zhì)上, SparkContext對編程來說, 主要功能就是創(chuàng)建第一個(gè)RDD出來。
RDD的創(chuàng)建可以通過2種方式, 通過并行化集合創(chuàng)建( 本地對象轉(zhuǎn)分布式RDD )和通過讀取外部數(shù)據(jù)源( 讀取文件)創(chuàng)建。
并行化創(chuàng)建是指將本地集合轉(zhuǎn)向分布式RDD,這一步的創(chuàng)建是分布式的開端,將本地集合轉(zhuǎn)化為分布式集合。
API如下
rdd=sparkcontext.parallelize(參數(shù)1,參數(shù)2) #參數(shù)1集合對象即可,比如list #參數(shù)2分區(qū)數(shù)完整代碼:
# coding: utf8 from pyspark import SparkConf, SparkContext if __name__ = '__main__': # e.構(gòu)建Spark執(zhí)行環(huán)境 conf = SparkConf().setAppName("create rdd").\ setMaster("local[*]"] sc = SparkContext(conf = conf) # sc對象的parallelize方法, 可以將本地集合轉(zhuǎn)換成RDD返回給你 data = [1, 2, 3, 4, 5, 6, 7, 8, 9] rdd = sc.parallelize(data, numSlices = 3) print(rdd.collect())
獲取RDD分區(qū)數(shù)返回值是Int數(shù)字:getNumPartitions API
用法rdd.getNumPartitions()
textFile API
這個(gè)API可以讀取本地?cái)?shù)據(jù),也可以讀取hdfs數(shù)據(jù)
使用方法:
sparkcontext.textFile(參數(shù)1,參數(shù)2) #參數(shù)1,必填,文件路徑支持本地文件支持HDFS也支持一些比如S3協(xié)議 #參數(shù)2,可選,表示最小分區(qū)數(shù)量。 #注意:參數(shù)2話語權(quán)不足,spark有自己的判斷,在它允許的范圍內(nèi),參數(shù)2有效果,超出spark允許的范圍,參數(shù)2失效完整代碼
1f __nane__ = '__main__: # B.構(gòu)建Spark執(zhí)行環(huán)境 conf = SparkConf().setAppNane("create rdd").\ setMaster("local[*]") sc = SparkContext(conf=conf) # textFile API 讀取文件 rdd = sc.textFile(".…/data/words.txt", 1000) print(rdd.getNumPartitions()) rdd2 = sc.textFile("hdfs://nodel:8020/input/words.txt", 1888) #最小分區(qū)數(shù)給了1060,但是實(shí)際就開了85個(gè), spark沒有理會(huì)你要求最少1008的要求,而是盡是多開。 print(rdd2.getNumPartitions()) print(rdd2.collect())
注意:textFile除非有很明確的指向性,一般情況下,我們不是指分區(qū)參數(shù)。
讀取文件的API,有個(gè)小文件讀取專用場景:適合讀取一堆小文件
用法:
sparkcontext.wholeTextFiles(參數(shù)1,參數(shù)2) #參數(shù)1,必填,文件路徑支持本地文件支持HDFS也支持一些比如S3協(xié)議 #參數(shù)2,可選,表示最小分區(qū)數(shù)量。 #注意:參數(shù)2話語權(quán)不足,這個(gè)API分區(qū)數(shù)量最多也只能開到文件數(shù)量
這個(gè)API偏向于少量分區(qū)讀取數(shù)據(jù),因?yàn)檫@個(gè)API表明了自己是小文件讀取專用,那么文件的數(shù)據(jù)很小。分區(qū)很多,導(dǎo)致shuffle的幾率更高.所以盡量少分區(qū)讀取數(shù)據(jù)。
DataFrame是什么意思?與RDD相比有哪些優(yōu)點(diǎn)?
北京校區(qū)