運行:
運行spark版的python:pyspark
Scala版:spark-shell
RDD:
數據集會被自動整理成RDD在集群上并行進行
RDD可以有執行一系列的動作(actions),這些動作可以返回值(values),轉換(transformations),或者指向新的RDD的指針。
常見行動操作:(會引起實際的計算)
.count()//相當于RDD的len()
.take(n)//取RDD中n個元素
.collect()輸出全部數據
.saveAsTextFile()輸出到文件
.reduce()對RDD應用一個reduce函數【reduce函數,對所有元素逐一應用,每次的輸入是新的一個跟上一次reduce的返回值lambda x,y: x+y】
常見轉化操作:(惰性求值所以不會計算)

RDD1.union(RDD2)//連接RDD
spark基本結構:
每一個spark都用一個驅動器程序來發起并行(spark shellsc)
driver通過SparkContext連接集群(sc)
sc的各種方法都是可以自動進行并行計算的
每一個計算圖稱為一個RDD
專門用來做鍵值對操作的RDD叫pair RDD
有對應的一套函數用來根據key進行操作(類似SQL,reduceByKey,groupByKey,join,排序)
PageRank例子:
1.每個頁面向相鄰頁面發送(自己的排序值/鄰居數量)
2.每個頁面把排序值更新為:0.15+0.85*鄰居發過來的值之和
python接口:
在python中import并初始化RDD對象,寫好后編寫sbt(推薦)或者Maven構建文件注明構建的方式,最后用spark-submit程序運行就可以
特別地,一些比較大的包(比如SQL)pyspark里面不會內建,而是要import一下
要看有什么能用的函數,只要sc.然后按Tab
SQL:
使用
context = SQLContext(sc)//一切sql類都是SQLContext的子類
results = context.sql(“SELECT * FROM people”)
發送一條SQL,返回一個RDD,每個元素一行
查詢:
df.select($"colA", $"colB")
數據格式:
1.DataFrame
? ? // 創建含有單列數據的 DataFrame
? ? val df = sqlContext.range(0, 16)
2.Dataset:
? ? 更新版本的DataFrame,有的時候會重載舊的DataFrame
? ? 因此當我們從1.6.x遷移到2.0.0的時候, 無需任何修改就直接用上了DataSet.
? 能在RDD的基礎上擴充功能,要變成Dataset:
? SQLContext.toDS()
? 能在RDD的基礎上擴充功能,要變成Dataset:
? SQLContext.toDS()
數據傾斜:
每臺機器數據量不一樣,每個元素處理的數據量不一樣...之類
Steaming:
用于把數據分batch

創建Steaming:
1.創建 StreamContext 對象
需要兩個參數,一個是 SparkConf 對象(sc),一個是分塊間隔時間。val ssc = new StreamingContext(sc, Seconds(2))
2.創建DStream對象(數據流對象)
? ? ? ? val lines = ssc.socketTextStream("localhost", 9999)
? ? ? ? 在 DStream 中,每一條記錄都是一行文本
3.對流進行操作
? ? ? ? 就對DStream 操作就行,用map之類的,返回新的DStream
? ? 

4.啟動流
? ? ? ? ssc.start()
DStream還支持滑動窗口之類的
Steaming通過checkpoint保證其24小時連續工作
MlLib:
跟sklearn里面的簡潔度差不多:
1.生成LabelPoint(用來保存樣本的數據和標簽的數據結構)
? ? posExamples=spamFeature.map(lambda features:LabeledPoint(1,features))? //把label設為1
? ? trainingData=posExamples.union(negExamples)? //因為有union的存在,所以把正負數據集并在一起比python還要簡單
? ? *也可以轉化成其他的數據結構,比如稀疏矩陣(Vector.dense(ndarray)),Rating之類,但是這些都不包含數據處理,比如加法都是沒有的
2.model=LogisticRegressionWithSGD.train(trainingData)
TFIDF:
HashingTF把每個單詞所需要的向量長度S % n =hash值,默認是2的20次方,所以產生的向量長度不超過2的20次方
不能并行的時候:
對于不能并行的算法,比如去掉停用詞之類的,不能直接寫在pyspark上,需要用sc.map(這里寫所需python代碼)這樣就可以在每個單節點上調用。
緩存RDD以重復使用:
調用MLlib前,寫sc.cache()(一開始就寫也沒關系)
進一步支持的其他數據科學工具:
任何 TensorFlow 程序都可以輕松地移植到 TensorFlowOnSpark 上。通常,只需要修改十行以內的 Python 代碼。

Scala基本語法:
定義一個新變量一定要用var
常量用val
有很強的隱式類型轉換:比如如果char沒有toint方法而string有,你硬是在char上調用tolin就會被轉成stri