數(shù)據(jù)分析EPHS(15)-Spark如何處理Hive的集合類型衬浑?

解鎖更多數(shù)據(jù)分析文章歡迎關(guān)注公眾號:數(shù)據(jù)分析EPHS

上一篇中我們介紹了hive中的數(shù)據(jù)類型放刨,其中一類比較重要的類型即集合類型,主要包括struct进统、map、array三種眉菱。那么我們在spark中處理這三種類型呢掉分?本文就來介紹一下俭缓。

1酥郭、數(shù)據(jù)介紹

我們還是先來回顧一下上篇中介紹的數(shù)據(jù):

創(chuàng)建表:

create table if not exists 
datatype_test4(
  id int,
  info struct<name:string,weight:double>,
  score array<Int>,
  info_map map<string,string>) 
row format delimited fields terminated by ',' 
COLLECTION ITEMS TERMINATED BY ';' 
MAP KEYS TERMINATED BY ':';

可以看到,我們定義了三種不同的集合類型字段惜姐,并指定了集合類型的分隔符為";"消返,即struct耘拇,array宇攻,以及map的不同kv之間用";"分割倡勇,同時定義了map的key和value之間用":"分割逞刷。

接下來妻熊,我們創(chuàng)建如下內(nèi)容的txt文件:

1,文文;70,99;96;100,name:文文;country:china
2,毛毛;60,99;92;100,name:毛毛;country:koera
3,超超;65,99;96;100,name:超超;country:japan

倒入hive中并查看:

load data local inpath '/Users/meituan_sxw/Downloads/test4.txt' into table datatype_test4;

select * from datatype_test4;

結(jié)果如下:

2扔役、struct類型

struct類型在spark中對應的類型為org.apache.spark.sql.catalyst.expressions.GenericRowWithSchema,對應的處理代碼如下:

val df = spark.sql(
      """
        |select * from
        |default.datatype_test4
      """.stripMargin)
      .map(row=>{
        val id = row.getAs[Int]("id")
        val info = row.getAs[GenericRowWithSchema]("info")
        val name = info.getAs[String]("name")
        val weight = info.getAs[Double]("weight")
      (id,name,weight)
      }).collect().foreach(println)

輸出結(jié)果為:

(1,文文,70.0)
(2,毛毛,60.0)
(3,超超,65.0)

其實一開始我也不知道是什么類型的亿胸,這主要看報錯了,假設(shè)我們按row.getAs[String]("info")去獲取對應的信息婉刀,則會發(fā)現(xiàn)有如下報錯:

所以根據(jù)報錯序仙,順藤摸瓜就可以啦。

3律秃、array類型

對于hive中array類型的數(shù)據(jù)治唤,如果用的是scala語言的話棒动,對應的類型是scala.collection.mutable.WrappedArray肝劲,處理方式如下:

val df = spark.sql(
  """
    |select * from
    |default.datatype_test4
  """.stripMargin)
  .map(row=>{
    val id = row.getAs[Int]("id")
    val score = row.getAs[WrappedArray[Int]]("score")
  (id,score(0),score(1),score(2))
  }).collect().foreach(println)

輸出結(jié)果為:

(1,99,96,100)
(2,99,92,100)
(3,99,96,100)

4、Map類型

對于hive中map類型的數(shù)據(jù)掷漱,對應的也是Scala中的scala.collection.immutable.Map類型榄檬,處理代碼如下:

val df = spark.sql(
  """
    |select * from
    |default.datatype_test4
  """.stripMargin)
  .map(row=>{
    val id = row.getAs[Int]("id")
    val info = row.getAs[Map[String,String]]("info_map")
    val name = info.get("name")
    val country = info.get("country")
    (id,name,country)

  }).collect().foreach(println)

對應的輸出如下:

(1,Some(文文),Some(china))
(2,Some(毛毛),Some(koera))
(3,Some(超超),Some(japan))

看上去有點奇怪,這是因為scala中的get() 方法返回的是一個叫 Option[String] 的類別鹿榜。Option 有兩個子類別锦爵,一個是 Some奥裸,一個是 None,當回傳 Some 的時候樟氢,代表成功地返回了一個 String侠鳄,同時可以通過 get() 這個函式拿到那個 String埠啃,如果返回的是 None伟恶,則代表沒有字符串可以給你。所以博秫,我們正確的寫法如下:

val df = spark.sql(
  """
    |select * from
    |default.datatype_test4
  """.stripMargin)
  .map(row=>{
    val id = row.getAs[Int]("id")
    val info = row.getAs[Map[String,String]]("info_map")
    val name = info.get("name").get
    val country = info.get("country").get
    (id,name,country)

  }).collect().foreach(println)

此時才是我們想要的結(jié)果:

(1,文文,china)
(2,毛毛,koera)
(3,超超,japan)

好了,本篇就到這里了台盯!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市良价,隨后出現(xiàn)的幾起案子蒿叠,更是在濱河造成了極大的恐慌,老刑警劉巖市咽,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異溯革,居然都是意外死亡谷醉,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門抖单,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人矛绘,你說我怎么就攤上這事』醢” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵园匹,是天一觀的道長劫灶。 經(jīng)常有香客問我掖桦,道長本昏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任涌穆,我火速辦了婚禮雀久,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘赖捌。我一直安慰自己,他們只是感情好罩锐,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布卤唉。 她就那樣靜靜地躺著,像睡著了一般桑驱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上痊硕,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天悦析,我揣著相機與錄音,去河邊找鬼。 笑死挡鞍,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的墨微。 我是一名探鬼主播扁掸,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼谴分!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起忘伞,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤沙兰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后鼎天,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡育勺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年绩鸣,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片化借。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡捡多,死狀恐怖蓖康,靈堂內(nèi)的尸體忽然破棺而出垒手,到底是詐尸還是另有隱情,我是刑警寧澤科贬,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站优妙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏套硼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一九妈、第九天 我趴在偏房一處隱蔽的房頂上張望雾鬼。 院中可真熱鬧,春花似錦呆贿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至耐齐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間埠况,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工夺衍, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留喜命,地道東北人。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓矛紫,卻偏偏與公主長得像,于是被迫代替她去往敵國和親颊咬。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348