背景
Spark版本:2.2
DataSet API網址:http://spark.apache.org/docs/2.2.1/api/java/org/apache/spark/sql/Dataset.html
正文
1.groupBy()
a.使用方法
按照某幾列元素進行分組
dataset.groupBy("columnName","columnName")
dataset.groupBy(dataset("columnName"))
b.注意事項
運算完成之後,返回的不是普通的DataSet數據類型,而是org.apache.spark.sql.RelationalGroupedDataset
org.apache.spark.sql.RelationalGroupedDataset可是用的方法有max、min、agg和sum等少量函數
c.使用舉例
logDS.groupBy("userID").max()
2.agg()
a.使用方法
dataset 聚合函數api,有多種列名的傳入方式,使用as,可是重新命名,所有計算的列sum、avg或者distinct都會成爲新的列,默認列明sum(columnName),常常跟在groupBy算子後使用
dataset.agg(sum(dataset("columnsName")),sum(dataset("")).as("newName"))
dataset.agg(sum("columnsName"),avg("columnsName").as("newName"))
b.注意事項
如果想要使用更多的內置函數,請引入: import org.apache.spark.sql.functions._
計算完會生成新的列,所以一般放了方便後期使用,會進行重命名
c.使用舉例
經長和groupBy後使用,對同一group內的數據操作
logDs.groupBy("userID").agg(max("consumed"),max("logID"))
3.sortWithinPartition()
a.使用方法
在分區內部進行排序,執行完成後,分區內部有序
dataset.sortWithinPartitions("columnName1","columnName2")
b.注意事項
一般在調用改方法之前,會按照規則將數據重新分區,否則沒有意義
調用之後可以接foreachPartition()遍歷每一個分區
但是奇怪的是,我沒有查到dataset相關分區的方法,只有rdd(key-value)纔有分區的能力,所以,這個方法的使用意義和環
境暫時還不清楚,使用的頻率也較低
c.使用舉例
personsDS.sortWithinPartitions("name").mapPartitions(it=>{
it.toList.reverse.iterator
})
4.sort()
a.使用方法
按照某幾列進行排序
dataset.sort(dataset("name"),dataset("age").desc)
dataset.sort(dataset("age").desc)
dataset.sort("columnName")
b.使用注意
傳入字符串爲列名的時候,無法指定降序排序
c.使用舉例
personsDS.sort(personsDS("age").desc)
5.OrderBy()
可以看到源代碼中,orderBy調用可sort
def orderBy(sortCol: String, sortCols: String*): Dataset[T] = sort(sortCol, sortCols : _*)
6.hint
7.select
a.使用說明
選取某幾列,但是在代碼中就已經固定了選取的列的數量,如果想動態選取列,請使用spark sql
. 可以在select中直接對列進行修改數據
b.使用舉例
dataset.select("columnName1","columnName2")
dataset.select(dataset("columnName"))
dataset.select(dataset("columnName")+1)
8.selectExpr
a.使用說明
同select但是,可以填寫表達式
b.使用舉例
ds.selectExpr("colA", "colB as newName", "abs(colC)")
ds.select(expr("colA"), expr("colB as newName"), expr("abs(colC)"))
9.rollup、cube
a.使用說明
rollup和cube的實現方式都是使用了RelationalGroupedDataset來實現,跟groupBy有點相似
cube: 選中的每個列的每種元素,進行組合
rollup:組合的種類較少,並不是全組合
使用場合比較少
b.使用舉例
方便理解,附上一些解釋文章:
https://www.cnblogs.com/wwxbi/p/6102646.html
https://blog.csdn.net/shenqingkeji/article/details/52860843
10.drop
a.使用說明
返回刪除某一列的新數據集
dataset.drop("name","age")
dataset.drop(personsDS("name"))
b.注意事項
如果想刪除多列,請使用string傳遞列名,column的方式只能刪除一列
11.duplicates
a.使用說明
刪除包含重複元素的行,重複元素可以是多個列的元素結合
val cols = Array("name","userID")
dataset.dropDuplicates(cols)
dataset.dropDuplicates("name")
b.使用舉例
val row1 = List("wq",22,15)
val row2 = List("wq",12,15)
val row3 = List("tom",12,15)
import spark.implicits._
val dataRDD = spark.sparkContext.parallelize(List(row1,row2,row3))
case class User(name:String,age:Int,length:Int)
val df = dataRDD.map(x=>User(x(0).toString,x(1).toString.toInt,x(2).toString.toInt))
val ds = df.toDS()
val cols = Array("age","length")
ds.dropDuplicates(cols).show
12.describe
a.使用說明
對所有數據,按照列計算:最大值、最小值、均值、方差和總數
b.使用舉例
還是使用上面的數據
ds.describe().show
13.repartition、coalesce
a.使用說明:
重新分區,但是repartirion不能夠使用自定義的partitioner,這裏只是分區數目的變化
當分區數目由大變小的時候--->coalesce 避免shuffler
當分區數目由小變大的時候--->repartirion
b.使用舉例
coalesce適合用在filterBy之後,避免數據傾斜,下面給出相關的使用文章:
https://blog.csdn.net/u013514928/article/details/52789169
14.filter
a.使用說明
filter 參數傳遞有三種方式:spark方式,sql方式,判斷方法
b.使用舉例
dss.filter(dss("age")>15)
dss.filter("age > 15")
dss.filter(func (User)=> boolean) 因爲我的數據每一行是一個User對象,所以方法輸入是一個User對象,返回爲boolean
filter還能查詢空值,其實還是sql的方式比如:
dataset.filter("colName is not null").select("colName").limit(10).show
15.dtypes、columns
a.使用說明
dtypes 返回一個數組,每個列的列名和類型
columns 返回一個數組,每個列列名
16.checkpoint
a.使用說明
checkpoint,rdd或者dataset磁盤存儲,用於比較關鍵的部分的數據,persist是內存緩存,而checkpoint是真正落盤的存儲,不會丟失,當第二次使用時,在檢查完cache之後,如果沒有緩存數據,就是使用checkpoint數據,而避免重新計算
b.相關文章
17.Na
a.使用說明
檢查ds中的殘缺元素,返回值爲DataFrameNaFunctions
DataFrameNaFunctions之後有三種方法比較常見:
drop、fill、replace
b.使用舉例
dataset.na.drop() 過濾包含空值的行
dataset.na.drop(Array("colName","colName")) 刪除某些列是空值的行
dataset.na.drop(10,Array("colName")) 刪除某一列的值低於10的行
dataset.na.fill("value") 填充所有空值
dataset.na.fill(value="fillValue",cols=Array("colName1","colName2") ) 填充某幾列空值
data1.na.fill(Map("colName1"->"value1","colName2"->"value2") ) 不同列空值不同處理
18.join
a.使用說明
ds之間做join操作,其中join參數中會有joinType來表示join的類型
b.使用舉例
我平時一般傾向於第三種join方式,也就是===
// Joining df1 and df2 using the column "user_id"
df1.join(df2, "user_id")
// Joining df1 and df2 using the columns "user_id" and "user_name"
df1.join(df2, Seq("user_id", "user_name"))
// The following two are equivalent:
df1.join(df2, $"df1Key" === $"df2Key")
df1.join(df2).where($"df1Key" === $"df2Key")
// Scala:
import org.apache.spark.sql.functions._
df1.join(df2, $"df1Key" === $"df2Key", "outer")
19.joinWith
a.使用說明
跟join 使用方式相似,但是joinWith之後的結果不會合併爲一個,如下使用舉例所示
b.使用舉例
20.apply、col
a.使用說明
跟select相同,輸入列名,返回列
b.使用舉例
public Column apply(String colName)
public Column col(String colName)
21.groupByKey
a.使用說明
從Dataset<Class> 轉換成 KeyValueGroupedDataset<K,T> 類型
不是按照key 分組,而是轉換成key,value結構
b.使用方法
KeyValueGroupedDataset後面可以接agg等api
personsDS.groupByKey(per=>(per.name,per.age))
22.union
a.使用說明
unionA方法:對兩個DataFrame進行組合
類似於SQL中的UNION ALL操作。
將兩個dataset所有數據,將一個dataset的所有行接在另外一個後面
b.使用舉例
personsDS.union(personsDS)
23.sample
a.使用說明
隨機取樣:
public Dataset<T> sample(boolean withReplacement, double fraction, long seed)
withReplacement是建立不同的採樣器;fraction爲採樣比例;seed爲隨機生成器的種子
b.使用舉例
dataset.sample(false,0.2,100);
24.randomSplit
a.使用說明
隨機劃分dataset
public Dataset<T>[] randomSplit(double[] weights, long seed)
b.使用舉例
double [] weights = {0.1,0.2,0.7};
//依據所提供的權重對該RDD進行隨機劃分
Dataset<Class> [] randomSplitDs = dataset.randomSplit(weights,100);
25.mapPartitions
a.使用說明
按照分區遍歷每一個元素
b.使用舉例
def doubleFunc(iter: Iterator[Int]) : Iterator[(Int,Int)] = {
var res = List[(Int,Int)]()
while (iter.hasNext)
{
val cur = iter.next;
res .::= (cur,cur*2)
}
res.iterator
}
val result = a.mapPartitions(doubleFunc)
26.foreach
a.使用說明
對每一行的元素進行遍歷
b.使用舉例
dataset.foreach(p=>p.age)
27.foreachPartitoins
a.使用說明
按照分區遍歷元素
當需要開關、訪問數據庫或者其他佔用資源的操作的時候,可是在foreachPartitions裏進行
b.使用舉例
foreachPartitions和mapPartions的區別:https://blog.csdn.net/u010454030/article/details/78897150
foreachPartitions開關數據庫舉例:https://blog.csdn.net/lsshlsw/article/details/49789373