如何在具有不同列数的RDD上执行设置转换?

时间:2017-06-29 08:12:52

标签: scala apache-spark

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

1 个答案:

答案 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匹配的确切语义取决于您的问题。

相关问题