如何从dataframe转换到array[caseclass]

uxhixvfz  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(463)

我正在使用databricks来处理数据。
Dataframe中的一列是数组。我想提取它以便处理它,但是语法有问题。我似乎仍将其提取为Dataframe,而不是转换为数组
下面是一个例子。我的数据是一组动物。每种动物都有一个名字和一组动作。
我定义了两个case类来保存数据

case class Movement ( 
  location: String,
  direction: String
)

case class Animal(
  var name: String,
  var movements: Array[Movement]
)

我定义了两种动物的数据,戈登和大卫

val m1 = Movement( "farm1", "arrive");
val m2 = Movement( "farm1", "leave");
val m3 = Movement( "farm2", "arrive");
val m4 = Movement( "farm3", "arrive");

val am = Array( m1, m2, m3);
val am2 = Array( m1, m2, m4);
val df : Animal = Animal("Gordon", am )
val df2 : Animal = Animal( "David", am2 )
val df3 = Seq( df, df2 ).toDF;

我有一套处理动作的程序。为了简化事情,在本例中,它只是显示它们

def showMoves( amIn: Array[Movement]) {
  for( mv <- amIn ) (
    println( mv.location + " " + mv.direction )
  )
}

这对戈登和大卫的动作很有效

showMoves( am )
showMoves( am2 )

结果是:

farm1 arrive
farm1 leave
farm2 arrive

farm1 arrive
farm1 leave
farm3 arrive

这是所有设置的数据。
现在我决定我只对戈登感兴趣,想提取他的动作

val df4 = df3.filter( "name == 'Gordon'")
var am3 = df4.select("movements").as[Array[Movement]]

斯卡拉告诉我:

am3:org.apache.spark.sql.Dataset[Array[Movement]] = [movements: array]

我现在要处理他的动作,这就是问题所在。

showMoves( am3 )

斯卡拉告诉我的

command-721439694904705:44: error: type mismatch;
 found   : org.apache.spark.sql.Dataset[Array[Movement]]
 required: Array[Movement]
showMoves( am3 )

因此,我从中了解到,我已将am3创建为数据集[array[movement]],而不是数组[movement],但我无法解决的是如何以正确的类型创建am3。

ds97pgxw

ds97pgxw1#

应该使用collectaslist函数将Dataframe转换为数组,然后将其Map到移动数组。当您这样做时,您会将所有数据收集到主节点。因此,如果数据量大,可能会出现oom错误。
所以

var am3 = df4.select("movements").as[Array[Movement]]

你应该使用

df4.select("movements").collectAsList()

相关问题