连接两个RDD[String]-Spark Scala
我有两个RDD:连接两个RDD[String]-Spark Scala,string,scala,join,apache-spark,rdd,String,Scala,Join,Apache Spark,Rdd,我有两个RDD: rdd1 [String,String,String]: Name, Address, Zipcode rdd2 [String,String,String]: Name, Address, Landmark 我正在尝试使用以下函数连接这两个RDD:rdd1.join(rdd2) 但是我得到一个错误:错误:value fullOuterJoin不是org.apache.spark.rdd.rdd[String]的成员 连接应该连接RDD[String],输出RDD应该类似于
rdd1 [String,String,String]: Name, Address, Zipcode
rdd2 [String,String,String]: Name, Address, Landmark
我正在尝试使用以下函数连接这两个RDD:rdd1.join(rdd2)
但是我得到一个错误:
错误:value fullOuterJoin不是org.apache.spark.rdd.rdd[String]的成员
连接应该连接RDD[String],输出RDD应该类似于:
rddOutput : Name,Address,Zipcode,Landmark
最后我想将这些文件保存为JSON文件
有人能帮我做同样的事情吗?如评论中所述,在加入之前,您必须将您的RDD转换为pairRDD,这意味着每个RDD必须是RDD[(键,值)]
。只有这样,才能通过键执行连接。在您的情况下,密钥由(名称、地址)组成,因此您必须执行以下操作:
// First, we create the first PairRDD, with (name, address) as key and zipcode as value:
val pairRDD1 = rdd1.map { case (name, address, zipcode) => ((name, address), zipcode) }
// Then, we create the second PairRDD, with (name, address) as key and landmark as value:
val pairRDD2 = rdd2.map { case (name, address, landmark) => ((name, address), landmark) }
// Now we can join them.
// The result will be an RDD of ((name, address), (zipcode, landmark)), so we can map to the desired format:
val joined = pairRDD1.fullOuterJoin(pairRDD2).map {
case ((name, address), (zipcode, landmark)) => (name, address, zipcode, landmark)
}
Spark的join
中关于PairRDD函数的更多信息是在对RDD上定义的,因此您的rdd1不是RDD[(String,T)]类型。您应该映射它,就像这个rdd1.map(v=>(v,1))(或者映射到另一个元组,这取决于您的任务)。如果你能更详细地解释你的目标(你希望从加入中得到什么),你可能会得到更多的帮助。@Vitalikotlayarenko:很抱歉没有早些说明。我刚刚编辑了这个问题。你能帮我一下吗?你的编辑帮不了什么忙。您没有一个RDD[String]
,而是两个RDD[String,String,String]
。您希望加入哪个字段<代码>名称
和地址
,还是其中一个?您需要将RDD更改为具有元组的条目,其中元组对中的第一个是键,其余的是值
,然后join将起作用。我想在名称和地址两个方面都加入。Hello@Daniel:我正在使用此函数处理RDD,以获得输出RDD1。我有什么办法可以调整这个吗i、 map(r=>{r._1+“|”+r._2+“|”+r._3+“|”+sys.extractDocument(r._3)});是,将映射结果设置为(键、值)
对。这已经说过好几次了,也许你可以注意一下?@user2122466,对不起,我不明白你的评论。也许你可以改进你的问题?@danieldpola.map
不会产生PairRDD,而RDD是yes,你是说.mapToPair
?@deFreitas在Scala中,成对的RDD被隐式转换为PairRDD,因此不需要调用mapToPair
,只需要正常的map
返回一对<如果您正在使用Java API,则需要code>mapToPair。