Spark(Scala):插入缺失的行以完成特定列中的序列

时间:2016-07-28 23:50:14

标签: scala apache-spark spark-dataframe

我有一些数据源,当它们无效时会丢失某些行。

在以下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")

例如:

  1. user1拥有所有必要的索引。
  2. user2缺少索引0和索引2.
  3. user3缺少索引1。
  4. 像这样:

    +-------+-----+---------+
    |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)
    

    这实际上有效但是当我使用真实数据(在索引中有数百万条记录和数百个值)运行时,它花了很长时间,因此我怀疑它可以更有效地完成。

    提前致谢!

0 个答案:

没有答案