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...