创建spark dataframe,其中行包含模式为的对象

1sbrub3j  于 2021-05-18  发布在  Spark
关注(0)|答案(1)|浏览(365)

我的目标是拥有一个sparkDataframe来保存我的每个 Candy 单独行中的对象及其各自的属性

+------------------------------------+
             main
+------------------------------------+
  {"brand":"brand1","name":"snickers"}
+------------------------------------+
  {"brand":"brand2","name":"haribo"}
+------------------------------------+

概念证明的案例类

case class Candy(
                   brand: String,
                   name: String)
val candy1 = Candy("brand1", "snickers")
val candy2 = Candy("brand2", "haribo")

到目前为止,我只把它们放在同一行:

import org.json4s.DefaultFormats
import org.json4s.jackson.Serialization.{read, write}
implicit val formats = DefaultFormats

val body = write(Array(candy1, candy2))
val df=Seq(body).toDF("main")

df.show(5, false)

把所有的东西都放在一排而不是两排。如何将每个对象拆分为自己的行,同时维护自己的架构 Candy 反对?

+-------------------------------------------------------------------------+
|                     main                                                |
+-------------------------------------------------------------------------+
|[{"brand":"brand1","name":"snickers"},{"brand":"brand2","name":"haribo"}]|
+-------------------------------------------------------------------------+
flvlnr44

flvlnr441#

是否要将该项作为json字符串保留在Dataframe中?
如果没有,可以这样做,使用数据集的advatange功能来处理case类:

val df=Seq(candy1, candy2).toDS

这将为您提供以下输出:

+------+--------+
| brand|    name|
+------+--------+
|brand1|snickers|
|brand2|  haribo|
+------+--------+

这是最好的选择,但是如果您想将数据保持为json字符串,那么您可以首先定义一个 toJson case类中的方法:

case class Candy(brand:String, name: String) {
     def toJson = s"""{"brand": "$brand", "name": "$name" }"""
}

然后使用该方法构建df:

val df=Seq(candy1.toJson, candy2.toJson).toDF("main")

输出

+----------------------------------------+
|main                                    |
+----------------------------------------+
|{"brand": "brand1", "name": "snickers" }|
|{"brand": "brand2", "name": "haribo" }  |
+----------------------------------------+

相关问题