scala - 如何在火花数据框中明智地访问元素列
问题描述
我有一个文本文件,其中包含以下数据
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) 同样适用于所有列。
向我们建议以列方式访问数据框的方法
解决方案
总体思路:只需用索引压缩每个值,创建一个 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)
推荐阅读
- r - 将一个列表中的数据框行绑定到另一个列表中的数据框
- angular - 材质对话框没有响应
- javascript - AES 加密/解密代码 Javascript(在浏览器中)
- python-logging - 如何记录 swagger / connexion 请求正文?
- python - Selenium 错误:AttributeError:“WebDriver”对象没有属性“Firefox”
- ios - 如何在继续之前连续检查是否按下了某个键?
- php - 为什么网站使用与 localhost 不同版本的 PHP?
- android - 更改广播接收器中的文本
- angular - 如何测试和调试触发云功能的机器人请求
- ios - 如何解释“completionHandler(true)”