如何为单个结果集

时间:2016-01-20 21:39:21

标签: scala count apache-spark cassandra

我有以下两个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)

1 个答案:

答案 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)