Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
连接两个RDD[String]-Spark Scala_String_Scala_Join_Apache Spark_Rdd - Fatal编程技术网

连接两个RDD[String]-Spark Scala

连接两个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应该类似于

我有两个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。