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")