如何明智地在Spark数据框中访问元素列

我有一个文本文件,其中包含以下数据
3 5
10 20 30 40 50
0 0 0 2 5
5 10 10 10 10
问题:
文件的第一行将为我们提供数据的行数和列数
如果列的每个元素都不是素数,则打印列的总和,否则打印零
输出:
0
30
40
0
0
说明: (0是因为列10 0 5的质数为5)
(30因为第20 0 10列没有素数,所以打印20 + 0 + 10 = 30)同样适用于所有列。
向我们建议以列方式访问数据框的方法

sunlifen11 回答:如何明智地在Spark数据框中访问元素列

一般思想:只需将每个值与索引压缩在一起,创建一个pairRDD,然后应用reduceByKey(此处的键为索引)在每一步中验证数字是否为质数。

val rows = spark.sparkContext.parallelize(
    Seq(
      Array(10,20,30,40,50),Array(0,2,5),Array(5,10,10)
    )
  )

def isPrime(i: Int): Boolean = i>=2 && ! ((2 until i-1) exists (i % _ == 0))

val result = rows.flatMap{arr => arr.map(Option(_)).zipWithIndex.map(_.swap)}
  .reduceByKey{
    case (None,_) | (_,None) => None
    case (Some(a),Some(b)) if isPrime(a) | isPrime(b) => None
    case (Some(a),Some(b)) => Some(a+b)
}.map{case (k,v) => k -> v.getOrElse(0)}

result.foreach(println)

输出(您必须收集数据才能按列索引排序):

(3,0)
(0,0)
(4,0)
(2,40)
(1,30)
本文链接:https://www.f2er.com/3093062.html

大家都在问