Hadoop系列之Spark安裝和使用(四)

spark簡介

Spark 的主要抽象是分佈式的元素集合(distributed collection of items),稱爲RDD(Resilient Distributed Dataset,彈性分佈式數據集),它可被分發到集羣各個節點上,進行並行操作。RDDs 可以通過 Hadoop InputFormats 創建(如 HDFS),或者從其他 RDDs 轉化而來。

Spark安裝步驟

Spark官網下載地址:http://spark.apache.org/downloads.html

tar -zxf spark-3.0.0-preview-bin-hadoop3.2.tgz #解壓

mv spark-3.0.0-preview-bin-hadoop3.2 spark #修改名稱

chown -R hadoop:hadoop spark #授權

cp spark/conf/spark-env.sh.template spark/conf/spark-env.sh #複製一個配置文件

vim conf/spark-env.sh #編輯配置文件,加入spark的classpath,如下:

export SPARK_DIST_CLASSPATH=$(/usr/local/soft/hadoop/bin/hadoop classpath)

./bin/spark-shell #啓動spark shell,如下是啓動成功的樣式

基本操作

val textFile = sc.textFile("file:///usr/local/soft/spark/README.md") #通過file:前綴指定讀取本地文件,讀取本地README文件加載到rdd中

textFile.count() #action API -count()統計該文本文件的行數

textFile.first() #RDD中的第一個item,對於文本文件,就是第一行內容

val linesWithSpark = textFile.filter(line => line.contains("Spark")) #transformation API - filter()篩選出包含Spark的行

linesWithSpark.count() #統計行數

textFile.filter(line => line.contains("Spark")).count() #可以在同一條代碼中同時使用多個api,連續進行運算,不僅可以使spark代碼更加簡潔,也優化了計算過程。

RDDs 支持兩種類型的操作

  • actions: 在數據集上運行計算後返回值
  • transformations: 轉換, 從現有數據集創建一個新的數據集

Spark提供了非常豐富的API, 下面兩表格列出了幾個常用的動作、轉換API,更詳細的API及說明可查閱官方文檔。

                                                               表1 常用的Action API

Action API 說明
count() 返回數據集中的元素個數
collect() 以數組的形式返回數據集中的所有元素
first() 返回數據集中的第一個元素
take(n) 以數組的形式返回數據集中的前n個元素
reduce(func) 通過函數func(輸入兩個參數並返回一個值)聚合數據集中的元素
foreach(func) 將數據集中的每個元素傳遞到函數func中運行

                                                             表2 常用的Transformation API

Transformation API 說明
filter(func) 篩選出滿足函數func的元素,並返回一個新的數據集
map(func) 將每個元素傳遞到函數func中,並將結果返回爲一個新的數據集
flatMap(func) 與map()相似,但每個輸入元素都可以映射到0或多個輸出結果
groupByKey() 應用於(K,V)鍵值對的數據集時,返回一個新的(K, Iterable<V>)形式的數據集
reduceByKey(func) 應用於(K,V)鍵值對的數據集時,返回一個新的(K, V)形式的數據集,其中的每個
值是將每個key傳遞到函數func中進行聚合

Spark SQL和DataFrames

Spark SQL 是 Spark 內嵌的模塊,用於結構化數據。在 Spark 程序中可以使用 SQL 查詢語句或 DataFrame API。DataFrames 和 SQL 提供了通用的方式來連接多種數據源,支持 Hive、Avro、Parquet、ORC、JSON、和 JDBC,並且可以在多種數據源之間執行 join 操作。

 

val df = spark.sqlContext.read.json("file:///usr/local/soft/spark/examples/src/main/resources/people.json") #導入數據源

df.show() #輸出數據源內容

df.select("name").show() #DataFrames處理結構化數據的操作,只顯示name列

df.select(df("name"),df("age")+1).show() #將“age”加1

df.filter(df("age")>21).show() #過濾出年齡大於21歲的數據

使用sql語句進行操作

將DataFrame註冊爲臨時表people

df.createOrReplaceTempView("people") #spark2.x以上寫法

df.registerTempTable("people) #spark1.6以下版本寫法

spark.sql("SELECT name, age FROM people WHERE age >= 13 AND age <= 19").show() #執行sql語句,並輸入結果

 

問題和解決

1、啓動spark shell的時候,報錯:Exception in thread "main" java.lang.NoSuchMethodError: jline.console.completer.CandidateListCompletionHandler.setPrintSpaceAfterFullCompletion(Z)V

解決方法:下載的spark版本不正確,需要下載和hadoop對應的版本

例如,本環境使用的是hadoop-3.2.1版本,因此,需要下載的spark版本爲

2、error: not found: value sqlContext(參考文章:https://blog.csdn.net/BigData_Mining/article/details/80104694

解決方法:

spark2.x.x之前的版本,執行的命令如下:

val df = sqlContext.read.json("file:///usr/local/soft/spark/examples/src/main/resources/people.json")

spark2.x.x之後的版本,執行的命需要加上spark,若還用之前的語句,就會出現此錯誤:

val df = spark.sqlContext.read.json("file:///usr/local/soft/spark/examples/src/main/resources/people.json")

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章