一,RDD,DataFrame和DataSet
DataFrame參照了Pandas的思想,在RDD基礎上增加了schma,能夠獲取列名信息。
DataSet在DataFrame基礎上進一步增加了數據類型信息,可以在編譯時發現類型錯誤。
DataFrame可以看成DataSet[Row],兩者的API接口完全相同。
DataFrame和DataSet都支持SQL交互式查詢,可以和 Hive無縫銜接。
DataSet只有在Scala語言和Java語言的Spark接口中才支持,在Python和R語言接口只支持DataFrame,不支持DataSet。
二,創建DataFrame
1,通過toDF方法創建
可以將Seq,List或者 RDD轉換成DataFrame。
2,通過CreateDataFrame方法動態創建DataFrame
可以通過createDataFrame的方法指定rdd和schema創建DataFrame。
這種方法比較繁瑣,但是可以在預先不知道schema和數據類型的情況下在代碼中動態創建DataFrame。
3,通過讀取文件創建
可以讀取json文件,csv文件,hive數據表或者mysql數據表得到DataFrame。
三,創建DataSet
DataSet主要通過toDS方法從Seq,List或者RDD數據類型轉換得到,或者從DataFrame通過as方法轉換得到。
1,通過toDS方法創建
可以將Seq,List或者 RDD轉換成DataFrame。
2,通過DataFrame的as轉換方法得到DataSet
四,RDD,DataFrame和DataSet的相互轉換
Spark的RDD,DataFrame和DataSet三種數據結構之間可以相互轉換。
五,DataFrame/DataSet保存成文件
可以保存成csv文件,json文件,parquet文件或者保存成hive數據表。
六,DataFrame的API交互
DataFrame和DataSet具有完全相同的API,此處演示DataFrame常用的一些API使用。
1,Action操作
DataFrame的Action操作包括show,count,collect,collectAsList,describe,take,takeAsList,head,first等。
2,類RDD操作
DataFrame支持RDD常用的map,flatMap,filter,reduce,distinct,cache,sample,mapPartitions,foreach,intersect,except等操作。
可以把DataFrame當做數據類型爲Row的RDD來進行操作。
3,類Excel操作
可以對DataFrame進行增加列,刪除列,重命名列,排序等操作,去除重複行,去除空行,就跟操作Excel表格一樣。
4,類SQL表操作
類SQL表操作包括表查詢(select,selectExpr,where,filter),表連接(join,union,unionAll),表分組聚合(groupby,agg,pivot)等操作。
七,DataFrame的SQL交互
將DataFrame/DataSet註冊爲臨時表視圖或者全局表視圖後,可以使用sql語句對DataFrame進行交互。
以下爲示範代碼。
八,用戶自定義函數
SparkSQL的用戶自定義函數包括二種類型,UDF和UDAF,即普通用戶自定義函數和用戶自定義聚合函數。
其中UDAF由分爲弱類型UDAF和強類型UDAF,前者可以在DataFrame,DataSet,以及SQL語句中使用,後者僅可以在DataSet中使用。
1,普通UDF
2,弱類型UDAF
弱類型UDAF需要繼承UserDefinedAggregateFunction。
3,強類型UDAF
強類型UDAF需要繼承自Aggregator,不可註冊。