Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala RDD groupby计数以及所有列_Scala_Apache Spark_Rdd_Scala Collections - Fatal编程技术网

Scala RDD groupby计数以及所有列

Scala 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

我需要在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      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代码