今天主要介紹一下如何將 Spark dataframe 的數據轉成 json 數據。用到的是 scala 提供的 json 處理的 api。sql
用過 Spark SQL 應該知道,Spark dataframe 自己有提供一個 api 能夠供咱們將數據轉成一個 JsonArray,咱們能夠在 spark-shell 裏頭舉個栗子來看一下。shell
import org.apache.spark.sql.SparkSession val spark = SparkSession.builder().master("master").appName("test").config("spark.sql.warehouse.dir", warehouseLocation).enableHiveSupport().getOrCreate(); //提供隱式轉換功能,好比將 Rdd 轉爲 dataframe import spark.implicits._ val df:DataFrame = sc.parallelize(Array(("abc",2),("efg",4))).toDF() df.show() /*-------------show ----------- +---+---+ | _1| _2| +---+---+ |abc| 2| |efg| 4| +---+---+ */ //這裏使用 dataframe Api 轉換成 jsonArray val jsonStr:String = a.toJSON.collectAsList.toString /*--------------- json String------------- [{"_1":"abc","_2":2}, {"_1":"efg","_2":4}] */
能夠發現,咱們能夠使用 dataframe 提供的 api 直接將 dataframe 轉換成 jsonArray 的形式,但這樣子卻有些冗餘。以上面的例子來講,不少時候我要的不是這樣的形式。數據庫
[{"_1":"abc","_2":2}, {"_1":"efg","_2":4}]
而是下面這種形式。apache
[{"abc":2}, {"efg":4}]
這纔是咱們一般會使用到的 json 格式。以 dataframe 的 api 轉換而成的 json 明顯太過冗餘。爲此,咱們須要藉助一些 json 處理的包,本着能懶則懶的原則,直接使用 scala 提供的 json 處理包。編程
import org.apache.spark.sql.{DataFrame, SparkSession} import org.apache.spark.sql.SparkSession val spark = SparkSession.builder().master("master").appName("test").config("spark.sql.warehouse.dir", warehouseLocation).enableHiveSupport().getOrCreate(); //提供隱式轉換功能,好比將 Rdd 轉爲 dataframe import spark.implicits._ val df:DataFrame = sc.parallelize(Array(("abc",2),("efg",4))).toDF() df.show() /*-------------show ----------- +---+---+ | _1| _2| +---+---+ |abc| 2| |efg| 4| +---+---+ */ //接下來不同了 val df2Array:Array[Tuple2[String,Int]] = df.collect().map{case org.apache.spark.sql.Row(x:String,y:Int) => (x,y)} val jsonData:Array[JSONObject] = aM.map{ i => new JSONObject(Map(i._1 -> i._2)) } val jsonArray:JSONArray = new JSONArray(jsonData.toList) /*-----------jsonArray------------ [{"abc" : 2}, {"efg" : 4}] */
大概說明一下上述的代碼,首先咱們要先將 df 變量進行 collect 操做,將它轉換成 Array ,可是要生成 jsonObject 得是 Array[Tuple2[T,T]] 的格式,因此咱們須要再進一步轉換成對應格式。這裏的 map 是函數式編程裏面的 map 。json
而後也是用 map 操做生成 Array[JSONObject],最後再轉換成 JSONArray 就能夠。api
將數據轉換成 json 的格式一般不能太大,通常用在 spark 跑出數據結果後寫入到其餘數據庫的時候會用到,好比 Mysql 。app
以上~~函數式編程
歡迎關注公衆號哈爾的數據城堡,裏面有數據,代碼,以及深度的思考。函數