Spark的零散筆記(三)

1.Spark SQL中的一個空值處理

背景是Dataframe轉(zhuǎn)為表之后使用Spark SQL,并需要過濾一些數(shù)值型空值。
Scala中的NaN值,一般可以看作是Float或Double類型,DF存儲為空字符串。

val a = Float.NaN

轉(zhuǎn)為表(createTempView)之后,DF中的NaN值會被記為“NaN”,該"NaN“值不會參與(Spark SQL的)count、avg等聚合運(yùn)算,如果需要對該值在Spark SQL中進(jìn)行識別或處理,可以在使用(相當(dāng)于把字符串賦了一個類型):

cast('NaN' as float)

進(jìn)一步的,Scala中的空值還有Nil(空列表)、null(無值無類型,一些文章建議少用)和Nothing(拋異常的時候用)等情況。
此外還有比較有特色Option(包含Some/None)等類型,其中None為”Empty“(isEmpty的結(jié)果),可以轉(zhuǎn)String等類型,理論上使用Option類型的安全性更好,但之前用的其他方式加的保護(hù),還沒機(jī)會深究。

2. Spark SQL中的列表

背景是在Spark SQL中做Group by 聚合,然后字段的聚合方法是把分組內(nèi)的數(shù)據(jù)寫入一個List或Array(作為一個字段)。實(shí)際Spark官網(wǎng)提供了不少SQL內(nèi)置函數(shù),摘錄幾個用到的:

  • 最基本的方法是collect_list(col),之后字段形式為[1,2,3,4,……]這種,其他還可以參考官網(wǎng)中collect或array開頭的幾個函數(shù)。比如:
select col1, sort_array(array_remove(collect_list(col2)),  cast('NaN' as float)) from table1 group by col1

該例子可以理解為按col1列聚合之后,將col2的內(nèi)容記錄為列表,然后移除列表中的NaN值,然后再排序。

  • 實(shí)際工程中,上例實(shí)際還用了一個UDF函數(shù)做進(jìn)一步處理,因此排序和去除空值的工作,實(shí)際也可以利用UDF函數(shù)進(jìn)行,但簡單測試看了一下,貌似在SQL中處理和在UDF中處理的效率基本是一致的。
  • Spark SQL中無論輸出的是List(collect_list結(jié)果)還是Array(sort_array結(jié)果),自定義函數(shù)的輸入條件都要用Seq,這個真是困惑了好久。
//定義udf的時候
def getmiddle(col: Seq[Float]):Float ={……}
/*使用的時候*/
select col1, getmiddle(collect_list(col2))  from table1 group by col1

3. Spark SQL中的結(jié)構(gòu)體+列表

在Spark SQL中使用結(jié)構(gòu)體,有struct和name_struct兩類,理論上后者應(yīng)該對應(yīng)scala的case class,但在SQL中利用聚合方式即時生成了一個復(fù)合型的數(shù)據(jù),類型大致為:array[float,string],把他包裝為array(struct)或array(name_struct)并傳到一個UDF函數(shù)中進(jìn)行進(jìn)一步處理,UDF的入口參數(shù)類型是seq[case class],此時一直報錯:

org.apache.spark.sql.catalyst.expressions.GenericRowWithSchema cannot be cast to myCaseClass

有文章說這種參數(shù)傳遞時,會丟棄schema,所以無法轉(zhuǎn)為case class,我沒找到原文,但目前看起來是這樣的。還嘗試了struct轉(zhuǎn)成元組等,也有問題,但懶得再細(xì)琢磨了。
后來實(shí)驗(yàn)了三種方法:

  • 1,SQL這邊用struct或name_struct都行,然后UDF這邊用seq[ROW]類型(org.apache.spark.sql._),然后用row(0)、row(1)這種方式取值(any類型)即可。
  • 2,SQL這邊加個to_json:array(to_json(name_struct)),然后UDF用字符串序列接收,再依次轉(zhuǎn)json處理。
  • 3,直接用多個array傳參數(shù),代碼其實(shí)更簡潔,但我總害怕出現(xiàn)位置錯誤,比如一些空值等情況,導(dǎo)致兩個隊(duì)列中的數(shù)值關(guān)系錯位等(邏輯上感覺不會,但沒做過測試,怕沒想周全)

4. DF的map等操作的一些限制

嘗試在DF的map操作中使用math-case或if,一直出錯,但感覺語法應(yīng)該是對的,因?yàn)橄嗤Z法拿掉條件語句就可以運(yùn)行。不知道是不支持還是怎樣,這個一直沒解決。

df.map(x=>
{ 
   if ……else……
})

此外在DF的map中使用另一個廣播變量DF(遍歷一個小表),一直會報錯,這個也沒解決。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,488評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,034評論 3 414
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,327評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,554評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,337評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,883評論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,975評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,114評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,625評論 1 332
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,555評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,737評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,244評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 43,973評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,362評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,615評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,343評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,699評論 2 370

推薦閱讀更多精彩內(nèi)容