Spark dataset api 列表 & 練習

背景

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.相關文章

spark中checkpoint的使用

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


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