先來張Spark 2.0賀圖,這樣也算直上Spark-shell了......XD
從開發環境就知道我這30天想寫的東西啦~基本上想寫
也就是SMACK中的S
、C
、K
。資料從前端接進來後用Spark streaming processing處理,
然後寫入Cassandra。Cassandra的Data modeling也是有意思的東西。
本系列文章不用有Spark與Scala的基礎知識,但必須有開發經驗背景是必須的,用過任何一種OO語言更好>
我會以Spark的角度切入講API與應用,以講解Scala為輔。希望讓不懂Spark與Scala的讀者,看完系列文之後,知道Spark in Scala的樣貌為何。
先在shell玩玩吧,之後較大的應用還是會以App為主,進shell吧:
$bin/spark-shell
[Snippet.1] Shell簡易開檔
scala> val lines = sc.textFile("LICENSE") ①
lines: org.apache.spark.rdd.RDD[String] = LICENSE MapPartitionsRDD[1] at textFile at <console>:24
scala> val lineCounts = lines.count ②
lineCounts: Long = 299
① 初始化一個SparkContext物件sc
,這是Spark常見的進入點。shell預設會幫你建立一個sc
可以直接使用。透過sc使用textFile函式逐行讀取檔案,並轉成名為lineRDD。
② 接著使用count
讀取集合元素數量
特別注意sc
物件在撰寫一般應用程式時,還是要自己宣告~
[Snippet.2]過慮出含有"BSD"字串的行(by匿名函式)
若只想取得含有某些特定字串的那幾行該怎麼做呢?
scala> val bsdLines = lines.filter(line=>line.contains("BSD")) ①
bsdLines: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[2] at filter at <console>:26
① (line=>line.contains("BSD"))代表導入一個Scala匿名函式,其輸入為line字串,
輸出為line.contains("BSD")的布林值。若為真則被濾出。結果會寫入另外一個immutable的變數bsdLines中(Scala中val為immutable
;var為mutable
)。
RDD提供了許多好用的函式,例如常用的map
、reduce
、filter
等,後續core API實戰篇會提到更多。之前(line=>line.contains("BSD"))這種寫法其實是所謂的匿名函式
寫法`,寫起來會比較簡潔,但對初學者來說比較不友善,我們可以將它改寫,首先先定義一個函式:
scala> def isBSD(line:String) = { line.contains("BSD")}
isBSD: (line: String)Boolean
再重寫先前的範例,明確用isBSD
函式:
scala> val bsdLines = lines.filter(isBSD)
bsdLines: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[2] at filter at <console>:28
scala> bsdLines.count
res1: Long = 33
如果要把結果印出到console,可以用println
函式:
scala> bsdLines.foreach(bLine=>println(bLine))
BSD-style licenses
The following components are provided under a BSD-style license. See project link for details.
(BSD License) AntLR Parser Generator (antlr:antlr:2.7.7 - http://www.antlr.org/)
(BSD License) ANTLR 4.5.2-1 (org.antlr:antlr4:4.5.2-1 - http://wwww.antlr.org/)
(BSD licence) ANTLR ST4 4.0.4 (org.antlr:ST4:4.0.4 - http://www.stringtemplate.org)
(BSD License) Javolution (javolution:javolution:5.5.1 - http://javolution.org)
...下略
這邊使用到RDD的foreach
操作,針對RDD的每個元素執行一個函式操作(就是(bLine=>println(bLine))
啦)。
此外函式能更為簡略的方式表達,尤其知道函式引用的參數數量是一個的時候
,常見的寫法例如:
bsdLines.foreach(println)
函式兩邊的bLine被省略了,很精簡吧,但初學者建議先寫長一點比較容易看的懂~
您好,我是spark新新手
我在安裝時就卡住了
想說先安裝在windows上
但下載下來後解壓縮並沒有如期產生工作資料夾
請問您也是安裝在windows上嗎?
謝謝
Spark是用Scala語言寫成的,建議你應該先去安裝Scala,然後才安裝Spark。祝你好運!