sql能查到数据 dataset对象里面没有值_DataSet
Spark最吸引開發(fā)者的就是簡(jiǎn)單易用、跨語(yǔ)言(Scala, Java, Python, and R)的API。
本文主要講解Apache Spark 2.0中RDD,DataFrame和Dataset三種API;它們各自適合的使用場(chǎng)景;它們的性能和優(yōu)化;列舉使用DataFrame和DataSet代替RDD的場(chǎng)景。本文聚焦DataFrame和Dataset,因?yàn)檫@是Apache Spark 2.0的API統(tǒng)一的重點(diǎn)。
Apache Spark 2.0統(tǒng)一API的主要?jiǎng)訖C(jī)是:簡(jiǎn)化Spark。通過(guò)減少用戶學(xué)習(xí)的概念和提供結(jié)構(gòu)化的數(shù)據(jù)進(jìn)行處理。除了結(jié)構(gòu)化,Spark也提供higher-level抽象和API作為特定領(lǐng)域語(yǔ)言(DSL)。
彈性數(shù)據(jù)集(RDD)
RDD是Spark建立之初的核心API。RDD是不可變分布式彈性數(shù)據(jù)集,在Spark集群中可跨節(jié)點(diǎn)分區(qū),并提供分布式low-level API來(lái)操作RDD,包括transformation和action。
何時(shí)使用RDD?
使用RDD的一般場(chǎng)景:
你需要使用low-level的transformation和action來(lái)控制你的數(shù)據(jù)集;
你的數(shù)據(jù)集非結(jié)構(gòu)化,比如:流媒體或者文本流;
你想使用函數(shù)式編程來(lái)操作你的數(shù)據(jù),而不是用特定領(lǐng)域語(yǔ)言(DSL)表達(dá);
你不想加入schema,比如,當(dāng)通過(guò)名字或者列處理(或訪問(wèn))數(shù)據(jù)屬性不在意列式存儲(chǔ)格式;
當(dāng)你可以放棄使用DataFrame和Dataset來(lái)優(yōu)化結(jié)構(gòu)化和半結(jié)構(gòu)化數(shù)據(jù)集的時(shí)候。
在Spark2.0中RDD發(fā)生了什么
你可能會(huì)問(wèn):RDD是不是成為“二等公民”了?或者是不是干脆以后不用了?
答案當(dāng)然是NO!
通過(guò)后面的描述你會(huì)得知:Spark用戶可以在RDD,DataFrame和Dataset三種數(shù)據(jù)集之間無(wú)縫轉(zhuǎn)換,而且只需要使用超級(jí)簡(jiǎn)單的API方法。
DataFrames
DataFrame與RDD相同之處,都是不可變分布式彈性數(shù)據(jù)集。不同之處在于,DataFrame的數(shù)據(jù)集都是按指定列存儲(chǔ),即結(jié)構(gòu)化數(shù)據(jù)。類似于傳統(tǒng)數(shù)據(jù)庫(kù)中的表。DataFrame的設(shè)計(jì)是為了讓大數(shù)據(jù)處理起來(lái)更容易。DataFrame允許開發(fā)者把結(jié)構(gòu)化數(shù)據(jù)集導(dǎo)入DataFrame,并做了higher-level的抽象;DataFrame提供特定領(lǐng)域的語(yǔ)言(DSL)API來(lái)操作你的數(shù)據(jù)集。
在Spark2.0中,DataFrame API將會(huì)和Dataset API合并,統(tǒng)一數(shù)據(jù)處理API。由于這個(gè)統(tǒng)一“有點(diǎn)急”,導(dǎo)致大部分Spark開發(fā)者對(duì)Dataset的high-level和type-safe API并沒(méi)有什么概念。
DataSets
從Spark2.0開始,DataSets扮演了兩種不同的角色:強(qiáng)類型API和弱類型API,見(jiàn)下表。從概念上來(lái)講,可以把DataFrame 當(dāng)作一個(gè)泛型對(duì)象的集合DataSet[Row], Row是一個(gè)弱類型JVM 對(duì)象。相對(duì)應(yīng)地,如果JVM對(duì)象是通過(guò)Scala的case class或者Java class來(lái)表示的,Dataset是強(qiáng)類型的。
Dataset API的優(yōu)勢(shì)
對(duì)于Spark開發(fā)者而言,你將從Spark 2.0的DataFrame和Dataset統(tǒng)一的API獲得以下好處:
1. 靜態(tài)類型和運(yùn)行時(shí)類型安全
考慮靜態(tài)類型和運(yùn)行時(shí)類型安全,SQL有很少的限制而Dataset限制很多。例如,Spark SQL查詢語(yǔ)句,你直到運(yùn)行時(shí)才能發(fā)現(xiàn)語(yǔ)法錯(cuò)誤(syntax error),代價(jià)較大。然后DataFrame和Dataset在編譯時(shí)就可捕捉到錯(cuò)誤,節(jié)約開發(fā)時(shí)間和成本。
Dataset API都是lambda函數(shù)和JVM typed object,任何typed-parameters不匹配即會(huì)在編譯階段報(bào)錯(cuò)。因此使用Dataset節(jié)約開發(fā)時(shí)間。
2. High-level抽象以及結(jié)構(gòu)化和半結(jié)構(gòu)化數(shù)據(jù)集的自定義視圖
DataFrame是Dataset[Row]的集合,把結(jié)構(gòu)化數(shù)據(jù)集視圖轉(zhuǎn)換成半結(jié)構(gòu)化數(shù)據(jù)集。例如,有個(gè)海量IoT設(shè)備事件數(shù)據(jù)集,用JSON格式表示。JSON是一個(gè)半結(jié)構(gòu)化數(shù)據(jù)格式,很適合使用Dataset, 轉(zhuǎn)成強(qiáng)類型的Dataset[DeviceIoTData]。
使用Scala為JSON數(shù)據(jù)DeviceIoTData定義case class。
緊接著,從JSON文件讀取數(shù)據(jù)
上面代碼運(yùn)行時(shí)底層會(huì)發(fā)生下面3件事。
Spark讀取JSON文件,推斷出其schema,創(chuàng)建一個(gè)DataFrame;
Spark把數(shù)據(jù)集轉(zhuǎn)換DataFrame -> Dataset[Row],泛型Row object,因?yàn)檫@時(shí)還不知道其確切類型;
Spark進(jìn)行轉(zhuǎn)換:Dataset[Row] -> Dataset[DeviceIoTData],DeviceIoTData類的Scala JVM object
我們的大多數(shù)人,在操作結(jié)構(gòu)化數(shù)據(jù)時(shí),都習(xí)慣于以列的方式查看和處理數(shù)據(jù)列,或者訪問(wèn)對(duì)象的指定列。Dataset 是Dataset[ElementType]類型對(duì)象的集合,既可以編譯時(shí)類型安全,也可以為強(qiáng)類型的JVM對(duì)象定義視圖。從上面代碼獲取到的數(shù)據(jù)可以很簡(jiǎn)單的展示出來(lái),或者用高層方法處理。
3. 簡(jiǎn)單易用的API
雖然結(jié)構(gòu)化數(shù)據(jù)會(huì)給Spark程序操作數(shù)據(jù)集帶來(lái)挺多限制,但它卻引進(jìn)了豐富的語(yǔ)義和易用的特定領(lǐng)域語(yǔ)言。大部分計(jì)算可以被Dataset的high-level API所支持。例如,簡(jiǎn)單的操作agg,select,avg,map,filter或者groupBy即可訪問(wèn)DeviceIoTData類型的Dataset。
使用特定領(lǐng)域語(yǔ)言API進(jìn)行計(jì)算是非常簡(jiǎn)單的。例如,使用filter()和map()創(chuàng)建另一個(gè)Dataset。
把計(jì)算過(guò)程翻譯成領(lǐng)域API比RDD的關(guān)系代數(shù)式表達(dá)式要容易的多。例如:
4. 性能和優(yōu)化
使用DataFrame和Dataset API獲得空間效率和性能優(yōu)化的兩個(gè)原因:
首先:因?yàn)镈ataFrame和Dataset是在Spark SQL 引擎上構(gòu)建的,它會(huì)使用Catalyst優(yōu)化器來(lái)生成優(yōu)化過(guò)的邏輯計(jì)劃和物理查詢計(jì)劃。
R,Java,Scala或者Python的DataFrame/Dataset API,所有的關(guān)系型的查詢都運(yùn)行在相同的代碼優(yōu)化器下,代碼優(yōu)化器帶來(lái)的的是空間和速度的提升。不同的是Dataset[T]強(qiáng)類型API優(yōu)化數(shù)據(jù)引擎任務(wù),而弱類型API DataFrame在交互式分析場(chǎng)景上更快,更合適。
其次,通過(guò)博客https://databricks.com/blog/2016/05/23/apache-spark-as-a-compiler-joining-a-billion-rows-per-second-on-a-laptop.html 可以知道:Dataset能使用Encoder映射特定類型的JVM 對(duì)象到Tungsten內(nèi)部?jī)?nèi)存表示。Tungsten的Encoder可以有效的序列化/反序列化JVM object,生成字節(jié)碼來(lái)提高執(zhí)行速度。
什么時(shí)候使用DataFrame或者Dataset?
你想使用豐富的語(yǔ)義,high-level抽象,和特定領(lǐng)域語(yǔ)言API,那你可以使用DataFrame或者Dataset;
你處理的半結(jié)構(gòu)化數(shù)據(jù)集需要high-level表達(dá),filter,map,aggregation,average,sum,SQL查詢,列式訪問(wèn)和使用lambda函數(shù),那你可以使用DataFrame或者Dataset;
想利用編譯時(shí)高度的type-safety,Catalyst優(yōu)化和Tungsten的code生成,那你可以使用DataFrame或者Dataset;
你想統(tǒng)一和簡(jiǎn)化API使用跨Spark的Library,那你可以使用DataFrame或者Dataset;
如果你是一個(gè)R使用者,那你可以使用DataFrame或者Dataset;
如果你是一個(gè)Python使用者,那你可以使用DataFrame或者Dataset。
你可以無(wú)縫地把DataFrame或者Dataset轉(zhuǎn)化成一個(gè)RDD,只需簡(jiǎn)單的調(diào)用.rdd:
總結(jié)
通過(guò)上面的分析,什么情況選擇RDD,DataFrame還是Dataset已經(jīng)很明顯了。RDD適合需要low-level函數(shù)式編程和操作數(shù)據(jù)集的情況;DataFrame和Dataset適合結(jié)構(gòu)化數(shù)據(jù)集,使用high-level和特定領(lǐng)域語(yǔ)言(DSL)編程,空間效率高和速度快。
福利部分
《大數(shù)據(jù)成神之路》大綱
大數(shù)據(jù)成神之路?shimo.im《幾百TJava和大數(shù)據(jù)資源下載》
資源下載?shimo.im總結(jié)
以上是生活随笔為你收集整理的sql能查到数据 dataset对象里面没有值_DataSet的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python openstack rab
- 下一篇: sum 去重_Excel函数,用到什么学