簡體   English   中英

如何在 spark scala 中將包裝的數組轉換為數據集?

[英]How to convert wrapped array to dataset in spark scala?

在此處輸入圖片說明

嗨,我是火花 scala 的新手。 我在 json 文件中有這個結構,我需要將它轉換為數據集。 由於嵌套數據,我無法執行此操作。

我試圖做一些我從某個帖子中得到的類似的東西,但它不起作用。 有人可以建議我解決方案嗎?

  spark.read.json(path).map(r=>r.getAs[mutable.WrappedArray[String]]("readings"))

您的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數據轉換為dataframedataset 在這里我使用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++])]|
+------------------------------------------------------------------------------------------------------------------------------------------------------------+

我希望答案有幫助

更新

Dataframedatasets幾乎相同,除了使用編碼器的datasets是類型安全的,並且datasetsdataframes優化。

長話短說,您可以通過創建case classesdataframe更改為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])

然后將dataframedataset

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM