2016-01-20 102 views
-1

我有以下两种reducByKey命令:如何合并两个ReduceByKey命令为单个结果集

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

也许你可以做一个更简单的例子来显示你想要做什么?我敢肯定,我们不需要带十几位数字的浮点数来说明这个问题。你已经接近重新打开问题了,所以这可能是值得的!祝你好运。 –

+0

这些数字是双打而不是浮动。我可以将它们更改为0以使其看起来更清晰。 – mithrix

回答

1

如果我理解正确的,你想一个键(Power),也被另一个键(Start_Frequency)来计算您的记录。

你已经用两个命令完成了这个,但是你希望能够用一个命令完成它。这不可能。 reduceByKey执行洗牌:它根据密钥分配记录。无法一次使用两个键完成此操作。

然而,有相关的事情,你可以做。

也许你的数据很大,但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 

在这种情况下,您将获得两个键组合的计数。例如:

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