如何将不同的数据帧组合和排序为一个?



给定两个数据帧,它们可能具有完全不同的模式,除了索引列(在本例中timestamp),例如下面的 df1 和 df2:

DF1:

timestamp | length | width
1     |   10   |  20
3     |    5   |   3

DF2:

timestamp |  name    | length
0     | "sample" |    3
2     | "test"   |    6

如何将这两个数据帧合并为一个看起来像这样的数据帧:

DF3:

timestamp |     df1        |     df2
| length | width |   name   | length  
0     |   null |  null | "sample" |    3
1     |   10   |  20   |   null   |   null
2     |   null |  null | "test"   |    6
3     |    5   |   3   |   null   |   null  

我对火花非常陌生,所以这实际上可能没有多大意义。但是我试图解决的问题是:我需要组合这些数据帧,以便以后可以将每一行转换为给定的对象。但是,它们必须按时间戳排序,因此当我写出这些对象时,它们的顺序是正确的。

因此,例如,给定上述df3,我将能够生成以下对象列表:

objs = [
ObjectType1(timestamp=0, name="sample", length=3),
ObjectType2(timestamp=1, length=10, width=20),
ObjectType1(timestamp=2, name="test", length=6),
ObjectType2(timestamp=3, length=5, width=3)
]

也许合并数据帧没有意义,但是我如何单独对数据帧进行排序,并以某种方式从全局timestamp排序的每个数据帧中获取Row

PS:请注意,我在两个数据帧中都重复了length。这样做是为了说明它们可能具有相同名称和类型的列,但表示完全不同的数据,因此不可能合并架构。

你需要的是一个完整的外部连接,可能重命名其中一列,类似于df1.join(df2.withColumnRenamed("length","length2"), Seq("timestamp"),"full_outer")

请参阅此示例,从您的构建(只是键入更少)

// data shaped as your example
case class t1(ts:Int, width:Int,l:Int)
case class t2(ts:Int, width:Int,l:Int)
// create data frames
val df1 = Seq(t1(1,10,20),t1(3,5,3)).toDF
val df2 = Seq(t2(0,"sample",3),t2(2,"test",6)).toDF
df1.join(df2.withColumnRenamed("l","l2"),Seq("ts"),"full_outer").sort("ts").show
+---+-----+----+------+----+                                                    
| ts|width|   l|  name|  l2|
+---+-----+----+------+----+
|  0| null|null|sample|   3|
|  1|   10|  20|  null|null|
|  2| null|null|  test|   6|
|  3|    5|   3|  null|null|
+---+-----+----+------+----+

相关内容

  • 没有找到相关文章

最新更新