微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通过内部数组的索引有效地连接数组RDD

如何解决通过内部数组的索引有效地连接数组RDD

我正在使用 Databricks 使用 Scala (v2.12) 运行 Spark 集群 (v3.0.1)。我将 Scala 文件编译为 JAR,并且正在使用 Databricks UI 中的 spark-submit 运行作业。

程序的逻辑从创建随机种子列表并使用以下行并行化开始:

val myListRdd = sc.parallelize(myList,partitions)

接下来,我希望在这个 RDD 上运行一个处理函数 f(...args),其中一个 argsmyListRdd 的各个元素。该函数的返回类型为 Array[Array[Double]]。所以在 Scala 中它看起来像:

val result = myListRdd.map(f(_,...<more-args>))

现在,我希望使用以下逻辑有效地收集输出数组数组。

f(...args) 的示例输出

Output 1: ((1.0,1.1,1.2),(1.3,1.4,1.5),...)
Output 2: ((2.0,2.1,2.2),(2.3,2.4,2.5),...)
Output 3: ((3.0,3.1,3.2),(3.3,3.4,3.5),...)
... so on

现在,由于这些是来自 f(..args) 的多个输出,我希望使用一些 spark RDD 操作的最终输出看起来像:

Type: Array[Array[Double]]
Value: ((1.0,1.2,2.0,2.2,3.0,3.2,...),1.5,2.3,2.5,3.3,3.5,...)

我是 Spark 和 Scala 的新手,所以我无法将我的逻辑映射到代码。我试图在上面的代码片段中使用 flatMap 而不是 map,但它没有给我我想要的输出。如果我尝试使用 collect 操作将输出 RDD 转换为数据帧,那么它会在执行作业时花费大量时间,而且我仍然需要在数据帧上运行连接函数

解决方法

如果您有一个类型的多个实例(在本例中为 Array[Array[Double]])并且您需要将它们组合成该类型的单个实例,那么您可能想要 fold()(或者可能是 {{ 1}}).

reduce()
,

您可以尝试减少函数的输出以组合数组:

myListRdd.map(f(_,...<more-args>))
         .reduce((x,y) => (0 to x.size - 1).toArray.map(i => x(i) ++ y(i)))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。