繁体   English   中英

SPARK RDD 在使用 Scala 的逻辑之间

[英]SPARK RDD Between logic using scala

我想使用 2 个 RDD 来检查之间的逻辑。 我不知道如何做到这一点

RDD1 :
Type: Array[(String, Long)]]
Array(("EMP1",0),("EMP2",1),("EMP3",2),("EMP4",3),("EMP5",4),("EMP6",5),("EMP7",6),("EMP8",7))



RDD2 :
Type :Array[Array[Any]]
Array([0,3,ABC],[3,5,XYZ],[5,1000,PQR])

我想检查范围逻辑,如

我想得到这样的输出:对于 RDD1 中的每个元素,检查 RDD1.x._2(给出长值)是否在 RDD2.X._1 和 RDD2.x._2(逻辑之间)之间。 如果存在,则连接来自 RDD2 的值

样本最终输出:

 Array[("EMP1 ABC",0),("EMP2 ABC",1),("EMP3 ABC",2),("EMP4 XYZ",3),("EMP5 XYZ",4),("EMP6 PQR",5),("EMP7 PQR",6),("EMP8 PQR",7)]
// create input rdd 
val rdd1 = spark.sparkContext.makeRDD(Array(("EMP1",0),("EMP2",1),("EMP3",2),("EMP4",3),("EMP5",4),("EMP6",5),("EMP7",6),("EMP8",7)))
val rdd2 = spark.sparkContext.makeRDD(Array((0,3,"ABC"),(3,5,"XYZ"),(5,1000,"PQR")))

// 1. perform a cross join/cartesian, the rdd looks like (("EMP1",0), (0,3,"ABC"))
// 2. filter out those records which are not within range
// 3. formatting 
rdd1.cartesian(rdd2)
    .filter(record => record._1._2 >= record._2._1 && record._1._2 < record._2._2)
    .map(record => (record._1._1 + " " + record._2._3, record._1._2))
    .collect().foreach(println(_))

// result
(EMP1 ABC,0)
(EMP2 ABC,1)
(EMP3 ABC,2)
(EMP4 XYZ,3)
(EMP5 XYZ,4)
(EMP6 PQR,5)
(EMP7 PQR,6)
(EMP8 PQR,7)

将之间的逻辑从 [ ] 更新为 [ )

谢谢

我建议您使用Dataframe s 或Dataset s,因为它们是rdd优化版本,具有更多功能。

所以你必须将rdd s 更改为dataframe s 作为

import sqlContext.implicits._
val df1 = rdd1.toDF("name1", "num")
val df2 = rdd2.toDF("start", "end", "name2")

最后使用joinselect方法得到你需要的最终结果

df1.join(broadcast(df2), df2("start") <= df1("num") && df2("end") > df1("num"))
  .select("name1", "name2", "num") 

这应该给你

+-----+-----+---+
|name1|name2|num|
+-----+-----+---+
|EMP1 |ABC  |0  |
|EMP2 |ABC  |1  |
|EMP3 |ABC  |2  |
|EMP4 |XYZ  |3  |
|EMP5 |XYZ  |4  |
|EMP6 |PQR  |5  |
|EMP7 |PQR  |6  |
|EMP8 |PQR  |7  |
+-----+-----+---+

现在您可以使用.rdd将其改回rdd

或者您可以继续使用dataframes本身进行处理

我希望答案有帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM