我有以下两个reducByKey命令:
sc.cassandraTable("Data","Value")
.where("\"Time_Key\" = 100")
.select("Power")
.as( (power:Float) => (power,1))
.reduceByKey(_ + _)
.collect
输出数据如:
(-100,2)
(-101,5)
(-103,3)
和另一列另一列
sc.cassandraTable("Data","Value")
.where("\"Time_Key\" = 100")
.select("Start_Frequency")
.as( (frequency:Double) => (frequency,1))
.reduceByKey(_ + _)
.collect
输出以下类型为Double的数字:
(1.00E8,1)
(1.10E8,1)
(1.09E8,2)
我想将这些组合成一个语句,该语句将在单个命令中输出,但不知道如何完成此操作。我如何将这两者合并为一个语句以得到结果:
(-100,2)(1.00E8,1)
(-101,5)(1.10E8,1)
(-103,3)(1.09E8,2)
答案 0 :(得分:1)
如果我理解正确,您希望按一个键(Power
)和另一个键(Start_Frequency
)计算记录。
您已经使用两个命令完成了此操作,但您希望能够使用一个命令完成此操作。这是不可能的。 reduceByKey
执行 shuffle :它根据密钥分配记录。没有办法一次使用两个键。
但是你可以做些相关的事情。
也许您的数据很大,但filter
只保留一小部分。您希望避免两次执行相同的filter
。在这种情况下,您可以这样做:
val filtered = sc.cassandraTable("Data","Value").where("\"Time_Key\" = 100")
filtered.cache()
val byPower = filtered
.select("Power")
.as( (power:Float) => (power,1))
.reduceByKey(_ + _)
.collect
val byFrequency = filtered
.select("Start_Frequency")
.as( (frequency:Double) => (frequency,1))
.reduceByKey(_ + _)
.collect
或者您可能希望通过两个键的组合来计算记录数。
sc.cassandraTable("Data","Value")
.where("\"Time_Key\" = 100")
.select("Power", "Start_Frequency")
.as((power:Float, frequency:Double) => ((power, frequency), 1))
.reduceByKey(_ + _)
.collect
在这种情况下,您可以获得两个键组合的计数。 E.g:
((-100,1.00E8),1)
((-100,1.09E8),1)
((-101,1.00E8),1)
((-101,1.09E8),2)
((-101,1.10E8),2)
((-103,1.09E8),1)
((-103,1.10E8),2)