首页 > 解决方案 > 将列表缓冲区中的数据帧行变成一列

问题描述

我正在尝试从我拥有的对象列表缓冲区中创建一个数据框。

我有一个不同的列表缓冲区,Fruit并希望使用这些事件创建一个 Dataframe 行(忽略案例类中的列)

import spark.implicits._

case class Fruit(
                   indentifier: String,
                   name: String)


var fruits= new scala.collection.mutable.ListBuffer[Any]()

val fruit1 = Fruit("one", "banana")
val fruit2 = Fruit("two", "apple")
val fruit3 = Fruit("three", "orange")

fruits+= fruit1
fruits += fruit2
fruits+= fruit3

val x = fruits.toSeq.toDF()

我的目标是创建不同的行,然后从这些行中创建一个数据框

我的对象数量和fruits内容都可以改变。在这种情况下,我试图让我的行是:

[{"indentifier":"one", "name":"banana"}, {"indentifier":"two", "name":"apple"}, {"indentifier":"three", "name":"orange"}]


+---------------------------------------------------------------------------------------------------------------------------+
|Fruits                                                                                                   
+------------------------------------------------------------------------------------------------------------------------------
|[{"indentifier":"one", "name":"banana"}, {"indentifier":"two", "name":"apple"}, {"indentifier":"three", "name":"orange"}]                                                                                                    |
+-----------------------------------------------------------------------------------------------------------------------------+

我试图这样做fruits.toSeq.toDF()但不能这样做,因为“toDF 不是 Seq[Any] 的成员”

标签: scaladataframe

解决方案


我们可以将您的列表缓冲区声明为案例类而不是Any?如果是这样,这对我来说很好:

var fruits= new scala.collection.mutable.ListBuffer[Fruit]()

val fruit1 = Fruit("one", "banana")
val fruit2 = Fruit("two", "apple")
val fruit3 = Fruit("three", "orange")

fruits+= fruit1
fruits += fruit2
fruits+= fruit3

val x = Seq(fruits).toDF()
// x: org.apache.spark.sql.DataFrame = [value: array<struct<indentifier:string,name:string>>]

x在这种情况下,与您指定的所需输出相匹配,请注意showspark-shell可能看起来不同。结果x.show(false)

+----------------------------------------------+
|value                                         |
+----------------------------------------------+
|[[one, banana], [two, apple], [three, orange]]|
+----------------------------------------------+

推荐阅读