我正在使用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。
1条答案
按热度按时间ds97pgxw1#
应该使用collectaslist函数将Dataframe转换为数组,然后将其Map到移动数组。当您这样做时,您会将所有数据收集到主节点。因此,如果数据量大,可能会出现oom错误。
所以
你应该使用