既然是要將Dataframe轉化成HashMap, 那麼爲什麼要把Dataframe轉化成HashMap? 使用場景是什麼?
需求
現在有一個json串"{‘address’:[[‘33’,‘3301’,‘330108’],‘xx路xx號’]}", 需要把address解析出來之後, 將行政區劃編碼替換爲對應的省市區縣, 最後輸出這樣的格式(“浙江省杭州市濱江區xx路xx號”).
開發給到的行政區劃表(area)的結構如下圖:
因爲行政區劃表在解析json的時候, 很多地方都會用到, 並且行政區劃表本身記錄數比較少, 佔用的內存空間較小, 就考慮將行政區劃編碼和對應的省市區縣放到一個HashMap中, 查詢效率也會比較高.
有的同學可能會問, 爲什麼不用join? 如果用join關聯, 在查省、市、區縣時,要麼是先過濾出三個Dataframe,分別代表省、市、區縣,然後再分別join,要麼就是不區分,關聯整個行政區劃表3次。這樣一來,不僅比較麻煩,效率也不高。
下面看具體代碼實現
import scala.collection.mutable
val hashMap = spark.read.table("ods.area") //行政區劃表
.select("area_code", "area_name") //只查詢需要的字段(行政區劃編碼、省市區縣名稱)
.rdd //Dataframe轉化爲RDD
//RDD中每一行轉化成area_code和area_name映射的key-value
.map(row => row.getAs("area_code").toString -> row.getAs("area_name").toString)
.collectAsMap() //將key-value對類型的RDD轉化成Map
.asInstanceOf[mutable.HashMap[String, String]]