Как объединить и отсортировать разные кадры данных в один? - PullRequest
0 голосов
/ 27 марта 2019

Имеются два кадра данных, которые могут иметь совершенно разные схемы, за исключением столбца индекса (в данном случае 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)
]

Возможно, объединение фреймов данных не имеет смысла, но как я могу отсортировать фреймы данных по отдельности и каким-то образом извлечь Row из каждого из них, упорядоченного по timestamp в глобальном масштабе?

PS: обратите внимание, что я повторил length в обоих кадрах данных.Это было сделано специально для того, чтобы проиллюстрировать, что они могут иметь столбцы с одинаковым именем и типом, но представлять совершенно разные данные, поэтому объединение схемы не представляется возможным.

1 Ответ

0 голосов
/ 27 марта 2019

вам нужно полное внешнее объединение, возможно, переименование одного из столбцов, что-то вроде 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|
+---+-----+----+------+----+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...