在Spark中加入两个数据帧正在爆炸

时间:2018-03-26 14:17:44

标签: scala apache-spark dataframe join

我正在尝试在单个字段上加入两个数据帧。为了做到这一点,我必须首先确保该字段是唯一的。所以我的活动顺序如下:

  1. 读入第一个数据框
  2. 选择我要加入的字段(例如field1),以及我想要加入的其他字段(field2
  3. .distinct
  4. 然后,对于第二个表..

    1. 读入第二个数据框
    2. 使用第一个表
    3. field1上进行左侧联接
    4. .distinct
    5. 我试图运行我的脚本,它的速度超过应有的时间。 为了调试这个,我在连接之前和之后的第一个表上放了一个println来记录计数,结果如下:

      在加入之前,记录计数为904,326。之后,2,658,632。 所以我认为它正在爆炸,但我不确定为什么。我认为这与选择两个字段后尝试仅使用一个“不同”有关。?

      请帮忙!

      以下是代码:

          val ticketProduct = Source.fromArg(args, "f1").read
         .select($"INSTRUMENT_SK", $"TICKET_CODES_SK")
         .distinct
      
        val instrumentD = Source.fromArg(args, "f2").read
      //    println("instrumentD count before join is " + instrumentD.count)
         .join(ticketProduct, Seq("INSTRUMENT_SK"), "leftouter")
      //   .select($"SERIAL_NBR", $"TICKET_CODES_SK")
         .distinct        
          println("instrumentD count after join is " + instrumentD.count)
      

1 个答案:

答案 0 :(得分:0)

您遇到的问题是,通过调用distinct,您只会移除field1 field2的值相同的行。 由于您加入field1,您可能希望field1的值是唯一的。

您可以尝试以下内容,而不是调用distinct

dataframe1.groupBy($"field1").agg(org.apache.spark.sql.functions.array($"field2"))

这将产生一个数据框,其中列field1是唯一的,并且field2的多个值会聚合到一个数组中。

这同样适用于第二个数据帧。

举个例子:假设您拥有包含以下内容的数据框架。

field1, field2
 1,       1
 1,       2

field1, field3
 1,      1
 1,      3

然后,distinct对它们没有任何作用,因为行是不同的。 现在,如果你要在field1上加入,你会得到以下结果。

 1, 1, 1
 1, 2, 1
 1, 1, 3
 1, 2, 3

相反的聚合将给出

field1, array_of_field2
 1,      [1,2]

field1, array_of field3
 1,      [1,3]

然后,连接将产生以下数据帧。

1, [1,2], [1,3]