簡介
org.apache.spark.sql.Dataset是Spark SQL中核心的類,定義如下:
class Dataset[T] extends Serializable |
本文基於spark2.3.0.
類方法
Actions
collect(): Array[T] 返回一個數組,包含Dataset所有行的數據。 注意:所有數據會被加載進driver進程的內存。 collectAsList(): List[T] 同上,但是返回Java list。 count(): Long 數據行數 describe(cols: String*): DataFrame 計算指定列的統計指標,包括count, mean, stddev, min, and max. head(): T 返回第一行 head(n: Int): Array[T] 返回前N行 first(): T 返回第一行,是head()的別名。 foreach(f: (T) ⇒ Unit): Unit 所有元素上應用f函數 foreachPartition(f: (Iterator[T]) ⇒ Unit): Unit 所有元素分區上應用f函數 reduce(func: (T, T) ⇒ T): T 根據映射函數func,對RDD中的元素進行二元計算,返回計算結果。 注意:提供的函數應滿足交換律及結合律,否則計算結果將是非確定的。 show(numRows: Int, truncate: Int, vertical: Boolean): Unit 表格形式打印出數據。numRows:顯示的行數,truncate:裁剪字符串類型值到指定長度,vertical:垂直打印。 show(numRows: Int, truncate: Int): Unit show(numRows: Int, truncate: Boolean): Unit show(truncate: Boolean): Unit numRows=20 truncate=20 show(numRows: Int): Unit truncate=20 show(): Unit numRows=20 truncate=20 summary(statistics: String*): DataFrame 計算數據集statistics指定的指標,可指定 count, mean, stddev, min, approximate quartiles (percentiles at 25%, 50%, and 75%), and max. 如未指定則會計算全部。 take(n: Int): Array[T] 獲取前n行 takeAsList(n: Int): List[T] 獲取前n行保存爲list toLocalIterator(): Iterator[T] 返回一個所有行的迭代器 The iterator will consume as much memory as the largest partition in this Dataset. |
基本函數(Basic Dataset functions)
as[U](implicit arg0: Encoder[U]): Dataset[U] 將數據映射成指定類型U,返回新的Dataset persist(newLevel: StorageLevel): Dataset.this.type 緩存數據,可設置緩存級別。 persist(): Dataset.this.type 同cache方法 cache(): Dataset.this.type 緩存數據,MEMORY_AND_DISK模式。 注意:RDD的cache函數默認是MEMORY_ONLY。 checkpoint(eager: Boolean): Dataset[T] 返回一個checkpointed的Dataset,Dataset的邏輯執行計劃將被截斷。 checkpoint(): Dataset[T] 同上,eager=true. columns: Array[String] 數組形式返回所有列名。 dtypes: Array[(String, String)] 數組形式返回所有列名及類型。 createGlobalTempView(viewName: String): Unit 創建全局臨時視圖(view),生命週期與Spark應用一致。 可以跨session訪問。e.g. SELECT * FROM global_temp.view1. createOrReplaceGlobalTempView(viewName: String): Unit 同上,已存在則替換。 createTempView(viewName: String): Unit 創建本地臨時視圖(view),僅當前SparkSession可訪問。 注意:不跟任何庫綁定,不能用db1.view1這樣的形式訪問。 createOrReplaceTempView(viewName: String): Unit 同上,已存在則替換。 explain(): Unit 打印物理執行計劃 另有:queryExecution變量,完整執行計劃。 explain(extended: Boolean): Unit 打印物理+邏輯執行計劃 hint(name: String, parameters: Any*): Dataset[T] 當前dataset指定hint。//todo e.g. df1.join(df2.hint("broadcast")) inputFiles: Array[String] 返回組成Dataset的輸入文件(Returns a best-effort snapshot of the files that compose this Dataset) isLocal: Boolean collect和take是否可以本地執行,不需要executor. localCheckpoint(eager: Boolean): Dataset[T] 執行本地Checkpoint,返回新dataset。 localCheckpoint(): Dataset[T] eager=true printSchema(): Unit 打印schema結構 rdd: RDD[T] dataset內部的RDD schema: StructType schema storageLevel: StorageLevel 當前存儲等級,沒有被persist則是StorageLevel.NONE toDF(): DataFrame toDF(colNames: String*): DataFrame 轉爲DataFrame,也可以將RDD轉爲DataFrame。 unpersist(): Dataset.this.type unpersist(blocking: Boolean): Dataset.this.type 刪除緩存,blocking表示是否等所有blocks刪除後才返回,刪除期間阻塞。 write: DataFrameWriter[T] DataFrameWriter,非流式數據寫接口。 writeStream: DataStreamWriter[T] DataStreamWriter,流式數據寫接口。 |
流式函數(streaming)
isStreaming: Boolean 是否流式數據 withWatermark(eventTime: String, delayThreshold: String): Dataset[T] Defines an event time watermark for this Dataset. //TODO |
強類型轉換(Typed transformations)
alias(alias: Symbol): Dataset[T] alias(alias: String): Dataset[T] as(alias: Symbol): Dataset[T] as(alias: String): Dataset[T] 給Dataset一個別名 coalesce(numPartitions: Int): Dataset[T] 分區合併(只能減少分區) distinct(): Dataset[T] dropDuplicates的別名 dropDuplicates(col1: String, cols: String*): Dataset[T] dropDuplicates(colNames: Array[String]): Dataset[T] dropDuplicates(colNames: Seq[String]): Dataset[T] dropDuplicates(): Dataset[T] 根據指定字段,對數據去重。 except(other: Dataset[T]): Dataset[T] 去除other中也有的行。同EXCEPT DISTINCT in SQL。 //TODO filter(func: (T) ⇒ Boolean): Dataset[T] filter(conditionExpr: String): Dataset[T] filter(condition: Column): Dataset[T] 根據條件過濾行 e.g. peopleDs.filter("age > 15") peopleDs.filter($"age" > 15) flatMap[U](func: (T) ⇒ TraversableOnce[U])(implicit arg0: Encoder[U]): Dataset[U] 第一步和map一樣,最後將所有的輸出合併。 groupByKey[K](func: (T) ⇒ K)(implicit arg0: Encoder[K]): KeyValueGroupedDataset[K, T] 現根據func函數生成key,然後按key分組。 intersect(other: Dataset[T]): Dataset[T] 求兩個dataset的交集,等同於INTERSECT in SQL. joinWith[U](other: Dataset[U], condition: Column): Dataset[(T, U)] inner equi-join兩個dataset joinWith[U](other: Dataset[U], condition: Column, joinType: String): Dataset[(T, U)] joinType可選:inner, cross, outer, full, full_outer, left, left_outer, right, right_outer limit(n: Int): Dataset[T] 返回前n行,與head的區別是,head是一個action,會馬上返回結果數組。 map[U](func: (T) ⇒ U)(implicit arg0: Encoder[U]): Dataset[U] 在每一個元素應用func函數,返回包含結果集的dataset。 mapPartitions[U](func: (Iterator[T]) ⇒ Iterator[U])(implicit arg0: Encoder[U]): Dataset[U] 在每一個分區應用func函數,返回包含結果集的dataset。 orderBy(sortExprs: Column*): Dataset[T] orderBy(sortCol: String, sortCols: String*): Dataset[T] sort的別名 sort(sortExprs: Column*): Dataset[T] sort(sortCol: String, sortCols: String*): Dataset[T] 按指定列排序,默認asc。 e.g. ds.sort($"col1", $"col2".desc) sortWithinPartitions(sortExprs: Column*): Dataset[T] sortWithinPartitions(sortCol: String, sortCols: String*): Dataset[T] 分區內排序,同"SORT BY" in SQL (Hive QL). randomSplit(weights: Array[Double]): Array[Dataset[T]] randomSplit(weights: Array[Double], seed: Long): Array[Dataset[T]] 按權重隨機分割數據 repartition(partitionExprs: Column*): Dataset[T] repartition(numPartitions: Int, partitionExprs: Column*): Dataset[T] repartition(numPartitions: Int): Dataset[T] 按指定表達式,分區數,重新分區(hash),同"DISTRIBUTE BY" in SQL。 默認分區數爲spark.sql.shuffle.partitions repartitionByRange(partitionExprs: Column*): Dataset[T] repartitionByRange(numPartitions: Int, partitionExprs: Column*): Dataset[T] 按指定表達式,分區數,重新分區,採用Range partition方式,按鍵範圍分區。 分區默認排序方式爲ascending nulls first,分區內數據未排序。 sample(withReplacement: Boolean, fraction: Double): Dataset[T] sample(withReplacement: Boolean, fraction: Double, seed: Long): Dataset[T] sample(fraction: Double): Dataset[T] sample(fraction: Double, seed: Long): Dataset[T] 隨機取樣本數據 withReplacement:Sample with replacement or not. fraction:Fraction of rows to generate, range [0.0, 1.0]. seed:Seed for sampling. select[U1](c1: TypedColumn[T, U1]): Dataset[U1] 根據列/表達式獲取列數據 transform[U](t: (Dataset[T]) ⇒ Dataset[U]): Dataset[U] 應用t函數轉換Dataset。 union(other: Dataset[T]): Dataset[T] 等於UNION ALL in SQL。 注意是按列位置合併: val df1 = Seq((1, 2, 3)).toDF("col0", "col1", "col2") val df2 = Seq((4, 5, 6)).toDF("col1", "col2", "col0") df1.union(df2).show // output: // +----+----+----+ // |col0|col1|col2| // +----+----+----+ // | 1| 2| 3| // | 4| 5| 6| // +----+----+----+ unionByName(other: Dataset[T]): Dataset[T] 同union方法,但是按列名合併: val df1 = Seq((1, 2, 3)).toDF("col0", "col1", "col2") val df2 = Seq((4, 5, 6)).toDF("col1", "col2", "col0") df1.unionByName(df2).show // output: // +----+----+----+ // |col0|col1|col2| // +----+----+----+ // | 1| 2| 3| // | 6| 4| 5| // +----+----+----+ where(conditionExpr: String): Dataset[T] where(condition: Column): Dataset[T] filter的別名 |
弱類型轉換(Untyped transformations)
返回類型爲DataFrame而不是Dataset。
agg(expr: Column, exprs: Column*): DataFrame agg(exprs: Map[String, String]): DataFrame agg(aggExpr: (String, String), aggExprs: (String, String)*): DataFrame 在整個dataset進行聚合。 ds.agg(...) 是 ds.groupBy().agg(...) 的簡寫。 e.g. ds.agg(max($"age"), avg($"salary")) ds.agg(Map("age" -> "max", "salary" -> "avg")) ds.agg("age" -> "max", "salary" -> "avg") apply(colName: String): Column col(colName: String): Column colRegex(colName: String): Column 返回指定列。 crossJoin(right: Dataset[_]): DataFrame cross join。 cube(col1: String, cols: String*): RelationalGroupedDataset cube(cols: Column*): RelationalGroupedDataset 使用指定列創建多維cube。 //TODO drop(col: Column): DataFrame drop(colNames: String*): DataFrame drop(colName: String): DataFrame 剪掉指定字段。 groupBy(col1: String, cols: String*): RelationalGroupedDataset groupBy(cols: Column*): RelationalGroupedDataset 按指定列分組 join(right: Dataset[_], joinExprs: Column, joinType: String): DataFrame join(right: Dataset[_], joinExprs: Column): DataFrame join(right: Dataset[_], usingColumns: Seq[String], joinType: String): DataFrame join(right: Dataset[_], usingColumns: Seq[String]): DataFrame join(right: Dataset[_], usingColumn: String): DataFrame join(right: Dataset[_]): DataFrame 與另一個DataFrame join。 joinExprs:$"df1Key" === $"df2Key" usingColumn:Seq("user_id", "user_name") joinType:Default inner. Must be one of: inner, cross, outer, full, full_outer, left, left_outer, right, right_outer, left_semi, left_anti. na: DataFrameNaFunctions 見DataFrameNaFunctions stat: DataFrameStatFunctions 見DataFrameStatFunctions rollup(col1: String, cols: String*): RelationalGroupedDataset rollup(cols: Column*): RelationalGroupedDataset 使用指定列進行rollup聚合。//TODO select(col: String, cols: String*): DataFrame select(cols: Column*): DataFrame selectExpr(exprs: String*): DataFrame 選取指定列、SQL表達式。 withColumn(colName: String, col: Column): DataFrame 新增或替換一列。 withColumnRenamed(existingName: String, newName: String): DataFrame 將指定列更名。 |
未分組(Ungrouped)
queryExecution: QueryExecution 執行計劃 sparkSession: SparkSession 創建該dataset的SparkSession sqlContext: SQLContext dataset的SQLContext toJSON: Dataset[String] 每行數據轉成JSON字符串。 toString(): String Any的toString |