2016-01-20 74 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)