我有两个RDD
个。一个RDD
的类型为RDD[(String, String, String)]
,第二个RDD
的类型为RDD[(String, String, String, String, String)]
。每当我尝试执行union,intersection等操作时,我都会收到错误: -
error: type mismatch;
found: org.apache.spark.rdd.RDD[(String, String, String, String,String, String)]
required: org.apache.spark.rdd.RDD[(String, String, String)]
uid.union(uid1).first()
在这种情况下如何执行设置操作?如果根本无法进行设置操作,我该怎么做才能获得与设置操作相同的结果而不会出现类型不匹配问题?
修改
这里是来自两个RDD的第一行的样本:
(" p69465323_serv80i"," 7 "," fb_406423006398063"," guest_861067032060185_android"," fb_100000829486587"," fb_100007900293502")
(fb_100007609418328,-795000,r316079113_serv60i)
答案 0 :(得分:0)
有几项操作要求两个RDD
具有相同的类型。
我们以union
为例:union
基本上连接两个RDD
。你可以想象连接以下内容是不合理的:
RDD1
(1, 2)
(3, 4)
RDD2
(5, 6, "string1")
(7, 8, "string2")
如您所见,RDD2
有一个额外的列。您可以做的一件事是,RDD1
处理其架构与RDD2
的架构匹配,例如通过添加默认值:
RDD1
(1, 2)
(3, 4)
RDD1 (AMENDED)
(1, 2, "default")
(3, 4, "default")
RDD2
(5, 6, "string1")
(7, 8, "string2")
UNION
(1, 2, "default")
(3, 4, "default")
(5, 6, "string1")
(7, 8, "string2")
您可以使用以下代码实现此目的:
val sc: SparkContext = ??? // your SparkContext
val rdd1: RDD[(Int, Int)] =
sc.parallelize(Seq((1, 2), (3, 4)))
val rdd2: RDD[(Int, Int, String)] =
sc.parallelize(Seq((5, 6, "string1"), (7, 8, "string2")))
val amended: RDD[(Int, Int, String)] =
rdd1.map(pair => (pair._1, pair._2, "default"))
val union: RDD[(Int, Int, String)] =
amended.union(rdd2)
如果您知道打印内容
union.foreach(println)
你将得到我们在上面的例子中得到的结果。
当然,您希望两个RDD
匹配的确切语义取决于您的问题。