【问题标题】:How to access elements columns wise in spark dataframes如何在火花数据框中明智地访问元素列
【发布时间】:2020-03-11 23:35:38
【问题描述】:

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

【问题讨论】:

  • 您好,欢迎来到 SO。请阅读stackoverflow.com/help/how-to-ask 这不是一个“为我做作业”的论坛。请向我们展示您已经尝试过的内容,特别是您遇到的问题/您不了解的内容,我们很乐意为您提供帮助

标签: scala apache-spark apache-spark-sql rdd


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-23
    • 1970-01-01
    • 1970-01-01
    • 2017-04-16
    • 1970-01-01
    • 2020-04-14
    • 2018-11-30
    相关资源
    最近更新 更多