首页 > 解决方案 > 如何在火花数据框中明智地访问元素列

问题描述

我有一个文本文件,其中包含以下数据
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) 同样适用于所有列。
向我们建议以列方式访问数据框的方法

标签: scalaapache-sparkapache-spark-sqlrdd

解决方案


总体思路:只需用索引压缩每个值,创建一个 pairRDD,然后应用一个 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)

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

(3,0)
(0,0)
(4,0)
(2,40)
(1,30)

推荐阅读