如何在spark scala中将包装数组转换为数据集?

如何在spark scala中将包装数组转换为数据集?,scala,apache-spark,Scala,Apache Spark,嗨,我是斯派克斯卡拉的新手。我在json文件中有这个结构,我需要将它转换为数据集。由于嵌套数据,我无法执行此操作 我试着做一些类似的事情,这是我从某个帖子上得到的,但它不起作用。有人能给我建议一下解决办法吗 spark.read.json(path).map(r=>r.getAs[mutable.WrappedArray[String]]("readings")) 您的JSON格式对于spark转换为dataframe无效json需要转换为dataframe/dataset行的信息应

嗨,我是斯派克斯卡拉的新手。我在json文件中有这个结构,我需要将它转换为数据集。由于嵌套数据,我无法执行此操作

我试着做一些类似的事情,这是我从某个帖子上得到的,但它不起作用。有人能给我建议一下解决办法吗

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

您的
JSON
格式对于spark转换为
dataframe
无效
json
需要转换为
dataframe
/
dataset
的信息应该是一行

因此,您要做的第一步是读取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)
+------------------------------------------------------------------------------------------------------------------------------------------------------------+
|clients                                                                                                                                                     |
+------------------------------------------------------------------------------------------------------------------------------------------------------------+
|[WrappedArray([aa1111111111111111c1111111111111112222222222e,AppleiOS,-46,49,ITU++], [09dfs1111111111111c1111111111111112222222222e,AppleiOS,-50,45,ITU++])]|
+------------------------------------------------------------------------------------------------------------------------------------------------------------+
现在选择
WrappedArray
是一个简单的步骤

dataFrame.select("readings.clients")
应该给你什么

+--------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|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)
+------------------------------------------------------------------------------------------------------------------------------------------------------------+
|clients                                                                                                                                                     |
+------------------------------------------------------------------------------------------------------------------------------------------------------------+
|[WrappedArray([aa1111111111111111c1111111111111112222222222e,AppleiOS,-46,49,ITU++], [09dfs1111111111111c1111111111111112222222222e,AppleiOS,-50,45,ITU++])]|
+------------------------------------------------------------------------------------------------------------------------------------------------------------+
我希望答案是有帮助的

已更新

数据帧
数据集
几乎相同,只是
数据集
是使用编码器的类型安全,并且
数据集
数据帧
优化

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])
长话短说,您可以通过创建
案例类
数据框
更改为
数据集
。对于您的案例,您需要三个
案例类

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])
然后将
数据帧
强制转换为
数据集

val dataSet = sqlContext.read.json(validJson).as[dataset]

您的手上应该有
dataset
:)

您不能使用以下代码创建数据集

spark.read.json(path).map(r => r.getAs[WrappedArray[String]]("readings"))
检查读取JSON时创建的DF的
clients
type模式

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")

你能在这里粘贴一个样本数据,告诉我们预期的结果是什么吗?谢谢。结果就像下面的格式did d7cc,读数WrappedArray[WrappedArray[rssi,snRatio,cid,clientOS,ssid]],ts]did是值为d7cc的列。。。在阅读专栏中,我得到了这些嵌套的WrappedArray。你能从中得到一些线索吗。我需要将其保存到数据集,以便我可以执行筛选和连接。不要粘贴数据的图像,而是粘贴输入数据的文本格式。非常感谢。你们能不能也给我演示一下如何在数据集中做,因为我需要在数据集中做。谢谢你应该为创建数据集创建案例类。我已经更新了我的答案@BirajDhakal,:)希望它能完全回答你的问题。当dataframe足够好时,为什么要使用dataset?