[英]How to convert wrapped array to dataset in spark scala?
您的JSON
格式對於 spark 轉換為dataframe
無效。 需要轉換為dataframe
/ dataset
row
json
信息應該是一行。
因此,您要做的第一步是讀取json 文件並轉換為有效的json
格式。 您可以使用wholeTextFiles
api 和一些替代品。
val rdd = sc.wholeTextFiles("path to your json text file")
val validJson = rdd.map(_._2.replace(" ", "").replace("\n", ""))
第二步是將有效的json
數據轉換為dataframe
或dataset
。 在這里我使用dataframe
val dataFrame = sqlContext.read.json(validJson)
這應該給你
+--------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|did |readings |
+--------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|d7cc92c24be32d5d419af1277289313c|[[WrappedArray([aa1111111111111111c1111111111111112222222222e,AppleiOS,-46,49,ITU++], [09dfs1111111111111c1111111111111112222222222e,AppleiOS,-50,45,ITU++]),1506770544]]|
+--------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
root
|-- did: string (nullable = true)
|-- readings: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- clients: array (nullable = true)
| | | |-- element: struct (containsNull = true)
| | | | |-- cid: string (nullable = true)
| | | | |-- clientOS: string (nullable = true)
| | | | |-- rssi: long (nullable = true)
| | | | |-- snRatio: long (nullable = true)
| | | | |-- ssid: string (nullable = true)
| | |-- ts: long (nullable = true)
現在選擇WrappedArray
很簡單,因為
dataFrame.select("readings.clients")
這應該給你
+------------------------------------------------------------------------------------------------------------------------------------------------------------+
|clients |
+------------------------------------------------------------------------------------------------------------------------------------------------------------+
|[WrappedArray([aa1111111111111111c1111111111111112222222222e,AppleiOS,-46,49,ITU++], [09dfs1111111111111c1111111111111112222222222e,AppleiOS,-50,45,ITU++])]|
+------------------------------------------------------------------------------------------------------------------------------------------------------------+
我希望答案有幫助
更新
Dataframe
和datasets
幾乎相同,除了使用編碼器的datasets
是類型安全的,並且datasets
比dataframes
優化。
長話短說,您可以通過創建case classes
將dataframe
更改為dataframe
dataset
。 對於您的案例,您需要三個case classes
。
case class client(cid: String, clientOS: String, rssi: Long, snRatio: Long, ssid: String)
case class reading(clients: Array[client], ts: Long)
case class dataset(did: String, readings: Array[reading])
然后將dataframe
為dataset
val dataSet = sqlContext.read.json(validJson).as[dataset]
你應該手頭有dataset
:)
您不能使用以下代碼創建 DataSet
spark.read.json(path).map(r => r.getAs[WrappedArray[String]]("readings"))
檢查讀取 JSON 時創建的 DF 的clients
類型架構。
spark.read.json(path).printSchema
root
|-- did: string (nullable = true)
|-- readings: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- clients: array (nullable = true)
| | | |-- element: struct (containsNull = true)
| | | | |-- cid: string (nullable = true)
| | | | |-- clientOS: string (nullable = true)
| | | | |-- rssi: long (nullable = true)
| | | | |-- snRatio: long (nullable = true)
| | | | |-- ssid: string (nullable = true)
| | |-- ts: long (nullable = true)
您可以使用以下代碼獲取scala.collection.mutable.WrappedArray
對象
spark.read.json(path).first.getAs[WrappedArray[(String,String,Long,Long,String)]]("readings")
如果您需要創建數據框,請使用以下內容。
spark.read.json(path).select("readings.clients")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.