Scala RDD groupby计数以及所有列
我需要在Scala RDD中获取所有列以及countScala RDD groupby计数以及所有列,scala,apache-spark,rdd,scala-collections,Scala,Apache Spark,Rdd,Scala Collections,我需要在Scala RDD中获取所有列以及count Col1 col2 col3 col4 us A Q1 10 us A Q3 10 us A Q2 20 us B Q4 10 us B Q5 20 uk A Q1 10 uk A Q3 10 uk A Q2 20 uk B Q4 10 uk B Q
Col1 col2 col3 col4
us A Q1 10
us A Q3 10
us A Q2 20
us B Q4 10
us B Q5 20
uk A Q1 10
uk A Q3 10
uk A Q2 20
uk B Q4 10
uk B Q5 20
我想要的结果是:
Col1 col2 col3 col4 count
us A Q1 10 3
us A Q3 10 3
us A Q3 10 3
us B Q4 10 2
us B Q5 20 2
uk A Q1 10 3
uk A Q3 10 3
uk A Q3 10 3
uk B Q4 10 2
uk B Q5 20 2
这类似于col1、col2和get计数的分组。现在我需要和col13,col4一起
我正在尝试SCALA RDD,如:
val Top_RDD_1 = RDD.groupBy(f=> ( f._1,f._2 )).mapValues(_.toList)
这就产生了
RDD[((String, String), List[(String, String, String, Double, Double, Double)])]
只有(col1,col2),列表(col1,col2,col3,col14)
结果类似于(us,A)列表((us,A,Q1,10),(us,A,Q3,10),(us,A,Q2,20))
如何获取列表计数并访问列表值
请帮我激活SCALA RDD代码
谢谢
Balaji。我看不出一种方法可以在RDD的一次“扫描”中做到这一点-您必须使用
reduceByKey
计算计数,然后将加入原始RDD。要高效地执行此操作(而不导致重新计算输入),您最好在加入之前缓存/持久化输入:
val keyed: RDD[((String, String), (String, String, String, Int))] = input
.keyBy { case (c1, c2, _, _) => (c1, c2) }
.cache()
val counts: RDD[((String, String), Int)] = keyed.mapValues(_ => 1).reduceByKey(_ + _)
val result = keyed.join(counts).values.map {
case ((c1, c2, c3, c4), count) => (c1, c2, c3, c4, count)
}
以下是python代码:
销售额=[“美国”、“A”、“第一季度”、“10”、“美国”、“A”、“第二季度”、“20”、“美国”、“B”、“第三季度”、“10”、“英国”、“A”、“第一季度”、“10”、“英国”、“A”、“第二季度”、“20”、“英国”、“B”、“第三季度”、“10]]——样本RDD数据
def func(数据):
ldata=list(data)#将迭代器类转换为list
size=len(ldata)#列表的计数(*)
返回ldata中i的[i+[size]#将计数(*)添加到列表中
sales_count=sales.groupBy(lambda w:(w[0],w[1])).mapValues(func)
#结果:[('US','A'),['US','A','Q1',10,2],'US','A','Q2',20,2]],('US','B'),['US','B','Q3',10,1]],('UK','A','Q1',10,2],[UK','A','Q2 20,2]],('UK','B'),[UK','B','Q3',10,1]]
finalResult=sales\u count.flatMap(lambda res:res[1])
#结果:[“美国”、“A”、“Q1”、“10、2”、“美国”、“A”、“Q2”、“20、2”、“美国”、“B”、“Q3”、“10、1”、“英国”、“A”、“Q1”、“10、2”、“英国”、“A”、“Q2”、“20、2”、“英国”、“B”、“Q3”、“10、1]]
#上述两种操作都可以合并到一条语句中
finalResult=sales.groupBy(lambda w:(w[0],w[1])).mapValues(func).flatMap(lambda res:res[1])
注意:自定义函数和我一样非常有用。您可以轻松地将相同的代码转换为scala代码