DataSet的介紹以及常用操作

2021-10-10 12:04:18 字數 2743 閱讀 1973

dataframe與dataset互相轉換

dataset是分布式的資料集合,dataset提供了強型別支援,也是在rdd的每行資料加了型別約束。dataset是在spark1.6中新增的新的介面。它集中了rdd的優點(強型別和可以用強大lambda函式)以及使用了spark sql優化的執行引擎。dataset可以通過jvm的物件進行構建,可以用函式式的轉換(map/flatmap/filter)進行多種操作。

dataset包含了dataframe的功能,spark2.0中兩者統一,dataframe表示為dataset[row],即dataset的子集。

(1)dataset可以在編譯時檢查型別

(2)並且是物件導向的程式設計介面

相比dataframe,dataset提供了編譯時型別檢查,對於分布式程式來講,提交一次作業太費勁了(要編譯、打包、上傳、執行),到提交到集群執行時才發現錯誤,這會浪費大量的時間,這也是引入dataset的乙個重要原因。

建立dataset一共可以有四種方式

第一種方式:spark.createdataset(「已經存在的scala集合」)

第二種方式:spark.createdataset(「已經存在的rdd」)

第三種方式:已經存在的scala集合呼叫tods

第四種方式:通過dataframe轉換變成dataset

通過spark.createdataset通過集合進行建立dataset

scala>

val ds1 = spark.createdataset(

1 to 10

)ds1: org.apache.spark.sql.dataset[

int]

=[value: int]

scala> ds1.show

從已經存在的rdd當中構建dataset

scala>

val ds2 = spark.createdataset(sc.textfile(

"file:///export/servers/person.txt"))

ds2: org.apache.spark.sql.dataset[

string]=

[value: string]

scala> ds2.show

通過樣例類配合建立dataset

scala>

case

class person(name:

string

,age:

int)

scala>

val persondatalist = list(person(

"zhangsan",18

),person(

"lisi",28

))scala>

val personds = persondatalist.tods

personds: org.apache.spark.sql.dataset[person]

=[name: string, age: int]

通過dataframe轉化生成

使用as[型別]轉換為dataset

scala>

case

class person(name:

string

,age:

long

)defined class person

scala>

val jsondf = spark.read.json(

"file:///export/servers/spark-2.2.0-bin-2.6.0-cdh5.14.0/examples/src/main/resources/people.json"

)jsondf: org.apache.spark.sql.dataframe =

[age: bigint, name: string]

scala>

val jsonds = jsondf.as[person]

jsonds: org.apache.spark.sql.dataset[person]

=[age: bigint, name: string]

dataframe和dataset可以相互轉化。

dataframe轉為 dataset

df.as[elementtype] 這樣可以把dataframe轉化為dataset。

dataset轉為dataframe

ds.todf() 這樣可以把dataset轉化為dataframe。

注意:rdd也可以與dataset互相轉換

rdd轉換成為dataset直接通過rdd呼叫tods方法即可

scala>

val linerdd = sc.textfile(

"file:///export/servers/person.txt"

)scala> linerdd.tods.show

dataset轉換成為rdd直接通過dataset呼叫rdd方法即可

scala>

val linerdd = sc.textfile(

"file:///export/servers/person.txt"

)scala>

val linedataset = linerdd.tods

scala>

val linerdd = linedataset.rdd

OpenCV座標體系介紹以及畫素點at操作講解

雖然使用opencv已經有一段時間,但是一直沒有涉及單個畫素點的操作。今天在提取畫素點繪製水平以及數值軸直方圖時,總感覺直方圖提取反了,直到x,y座標交換才得出正確結果。出處 前言相信很多朋友在使用opencv的時候會遇到乙個小問題,且有時候對這樣的小問題沒有引起足夠的重視,或者通過表面想當然的去程...

OpenCV座標體系介紹以及畫素點at操作講解

雖然使用opencv已經有一段時間,但是一直沒有涉及單個畫素點的操作。今天在提取畫素點繪製水平以及數值軸直方圖時,總感覺直方圖提取反了,直到x,y座標交換才得出正確結果。找到這篇文章,座標系以及畫素點的提取作者介紹的很詳細,貼出來提醒自己的同時與大家共同學習。出處 前言 相信很多朋友在使用openc...

FMDB介紹以及在 swift 中的資料庫操作

fmdb 是乙個處理資料的第三方框架,框架是對 sqlite 的封裝,整個框架非常輕量級又不失靈活性,而且更加物件導向.由於使用 sqlite 進行資料庫操是執行緒不安全的,遇到多執行緒同時操作乙個表時,可能發生一些無法 的錯誤.所以更多的我們會借助 fmdb 進行資料庫操作.1 fmdatabas...