我正在尝试在单个字段上加入两个数据帧。为了做到这一点,我必须首先确保该字段是唯一的。所以我的活动顺序如下:
field1
),以及我想要加入的其他字段(field2
).distinct
然后,对于第二个表..
field1
上进行左侧联接
.distinct
我试图运行我的脚本,它的速度超过应有的时间。
为了调试这个,我在连接之前和之后的第一个表上放了一个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)
答案 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]