如何在spark scala中将包装数组转换为数据集?
嗨,我是斯派克斯卡拉的新手。我在json文件中有这个结构,我需要将它转换为数据集。由于嵌套数据,我无法执行此操作 我试着做一些类似的事情,这是我从某个帖子上得到的,但它不起作用。有人能给我建议一下解决办法吗如何在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行的信息应
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?