我有一些数据源,当它们无效时会丢失某些行。
在以下DataFrame中,每个用户应该有3行,从索引0到索引2.
val df = sc.parallelize(List(
("user1",0,true),
("user1",1,true),
("user1",2,true),
("user2",1,true),
("user3",2,true)
)).toDF("user_id","index","is_active")
例如:
像这样:
+-------+-----+---------+
|user_id|index|is_active|
+-------+-----+---------+
| user1| 0| true|
| user1| 1| true|
| user1| 2| true|
| user2| 1| true|
| user3| 0| true|
| user3| 2| true|
+-------+-----+---------+
我想插入默认行并将它们放入以下DataFrame中。
+-------+-----+---------+
|user_id|index|is_active|
+-------+-----+---------+
| user1| 0| true|
| user1| 1| true|
| user1| 2| true|
| user2| 0| false|
| user2| 1| true|
| user2| 2| false|
| user3| 0| true|
| user3| 1| false|
| user3| 2| true|
+-------+-----+---------+
我已经看到一个单独且类似的问题,其中转动表的答案使每个用户有3列。但是,1依赖于某些用户存在索引0到2这一事实。在我的实际情况中,索引是在一个非常大的范围内,所以我不能保证在转轴之后所有列都将完成。旋转似乎是一个相当昂贵的操作,然后取消枢轴以获得第二个DataFrame。
我还试图像这样创建一个新的DataFrame:
val indexDF = df.select("user_id").distinct.join(sc.parallelize(Seq.range(0, 3)).toDF("ind"))
val result = indexDF.join(df, Seq("user_id", "index"), "left").na.fill(0)
这实际上有效但是当我使用真实数据(在索引中有数百万条记录和数百个值)运行时,它花了很长时间,因此我怀疑它可以更有效地完成。
提前致谢!