当前位置: 首页 > 知识库问答 >
问题:

在Scala-Spark1.5.2中递归过滤RDD

江嘉悦
2023-03-14

我有一个有50列的RDD,我想为每一行获取第一个元素和最后5列,其中最后一行的第一个字符的值是一个数字,如果最后一列的第一个字符是一个字符,重复地继续这个过程。例如,让我们假设原始RDD具有以下内容(为了使其更容易被读取,没有包含键):

[45 first values], 1, 2, a, 3, 4
[44 first values], 0, 1, 2, 3, 4, b
[43 first values], 10, 11, 12, 13, 14, q, a
1, 2, a, 3, 4
0, 1, 2, 3, 4
10, 11, 12, 13, 14
var aux = rdd.map(row => row.slice(0, 1) ++ row.slice(45, 50)).filter(elem => elem(5)._2(0).isDigit == true)

按照这个语法,我还可以过滤原始RDD的第N个元素:

var aux = rdd.map(row => row.slice(0, 1) ++ row.slice(44, 50)).filter(elem => elem(5)._2(0).isDigit == true).map(_.slice(0,6))

我的问题是,是否有任何可能的方法来迭代地指定映射和/或过滤器中的元素范围或类似的东西,并在一对或一个句子中执行这个过程,或者是否需要将这些句子中的每个结果保存在一个辅助变量中,然后尝试将每个结果合并到一个新的RDD中?

共有1个答案

闻人修平
2023-03-14

您可能需要(在map方法中)类似于

row.dropRightWhile(cell => !cell(0).isDigit)

但是,droprightwhile不是seq上的方法,因此您可能需要在此处理前后执行reverse,如下所示:

row.reverse.dropWhile(cell => !cell(0).isDigit).reverse
 类似资料:
  • Scala 函数 递归函数在函数式编程的语言中起着重要的作用。 Scala 同样支持递归函数。 递归函数意味着函数可以调用它本身。 以上实例使用递归函数来计算阶乘: object Test { def main(args: Array[String]) { for (i <- 1 to 10) println(i + " 的阶乘为: = " + factori

  • 我不明白为什么我会得到这个最大深度错误。iam试图使用bst递归方法在数组中查找数字索引,下面是我的代码 任何人都可以告诉我代码块中发生了什么 错误块: PS C:\Users\admin\Desktop\DSA

  • 任务是实现递归方法,返回 Future 并且由于这一部分("在其他递归(结果::: res,尝试1)")代码失败与错误,因为它期望未来[Seq[结果]],但实际上返回未来[对象]。 据我所知,问题在于yield块内的表达式必须返回Seq[Result],以便将来由Monad进行后续包装。但是“递归(结果::res,尝试1)”将返回未来。因此,不是预期的Seq[Result]收益率,而是包含未来的[

  • 是否可以在HSQLDB中创建递归存储过程? 我编写了以下一个来更新一个记录,并递归地更新所有父记录: 但我得到了以下错误: 在HyperSQL用户指南中,我找到了一些信息(请参阅HyperSQL用户指南中的递归例程),但它似乎只支持函数。 提前感谢您的支持。

  • 我有以下示例代码: 这段代码编译并在2.9. x上正确运行(输出“匹配:这是一个foo”,后面跟着“这是一个递归方法”),但它在2.10.2上不工作。相反,我得到了编译时错误:类型参数[_1美元]不符合trait Recurse的类型参数边界[T 有趣的是,问题只出现在模式匹配器中。如果我删除匹配块,代码将编译并输出“这是递归上的一个方法”。 更有趣的是,模式匹配仍然无法编译,即使其中只有默认情况