Scala 如何在spark数据帧中按列访问元素

Scala 如何在spark数据帧中按列访问元素,scala,apache-spark,apache-spark-sql,rdd,Scala,Apache Spark,Apache Spark Sql,Rdd,我有一个包含以下数据的文本文件 35 102030040 0025 5100 问题: 文件的第一行将给出数据的行数和列数 如果列的每个元素都不是素数,则打印列的和,否则打印零 输出: 0 30 40 0 0 说明: (0,因为列10 0 5有质数5) (30因为第20 0 10列没有素数,所以打印20+0+10=30)同样适用于所有列。 建议我们以列方式访问数据帧的方法总体思路:只需使用索引压缩每个值,创建一个pairdd,然后应用reduceByKey(这里的键是索引),在每一步验证数字是否为

我有一个包含以下数据的文本文件
35
102030040
0025
5100
问题:
文件的第一行将给出数据的行数和列数
如果列的每个元素都不是素数,则打印列的和,否则打印零
输出:
0
30
40
0
0
说明: (0,因为列10 0 5有质数5)
(30因为第20 0 10列没有素数,所以打印20+0+10=30)同样适用于所有列。

建议我们以列方式访问数据帧的方法总体思路:只需使用索引压缩每个值,创建一个pairdd,然后应用reduceByKey(这里的键是索引),在每一步验证数字是否为素数

val rows = spark.sparkContext.parallelize(
    Seq(
      Array(10,20,30,40,50),
      Array(0,0,0,2,5),
      Array(5,10,10,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)
输出(必须收集数据才能按列索引排序):


大家好,欢迎来到SO。请阅读这不是一个“为我做家庭作业”的论坛。请向我们展示您已经尝试过的内容,特别是您遇到的问题/您不了解的问题,我们将乐意提供帮助
(3,0)
(0,0)
(4,0)
(2,40)
(1,30)