如何在两个模式RDD上执行连接操作?

时间:2014-08-22 17:09:18

标签: apache-spark rdd

我有两个SchemaRDD,我想对它们执行连接操作(与SQL连接相同)。 请帮帮我。

2 个答案:

答案 0 :(得分:4)

如果将两个SchemaRDD注册为表,则实际上可以执行 SQL连接。虽然以下示例使用案例类,但该技术并不依赖于它们:

val sqlContext = new org.apache.spark.sql.SQLContext(sc)
import sqlContext._
case class Score(name: String, score: Int)
case class Age(name: String, age: Int)
val scores = sc.textFile("scores.txt").map(_.split(",")).map(s => Score(s(0),s(1).trim.toInt))
val ages = sc.textFile("ages.txt").map(_.split(",")).map(s => Age(s(0),s(1).trim.toInt))
scores.registerAsTable("scores")
ages.registerAsTable("ages")
val joined = sqlContext.sql("""
    SELECT a.name, a.age, s.score
    FROM ages a JOIN scores s
    ON a.name = s.name""")
joined.collect().foreach(println)

另一种不需要注册的方法是使用语言集成语法(人们怀疑有一种简化方法):

val scoresAliased = scores.as('s)
val agesAliased = ages.as('a)
val joined = 
  scoresAliased.join(agesAliased, Inner, Some("s.name".attr === "a.name".attr))

答案 1 :(得分:2)

来自spark documentation

  

join(otherDataset,[numTasks])在类型(K,V)的数据集上调用时   和(K,W),返回(K,(V,W))对的数据集与所有对   每个键的元素。外连接也通过支持   leftOuterJoin和rightOuterJoin。

您希望通过地图转换运行schemaRDD以将其放入(K,V)表单中:K是您要加入的键,而V可以是整行对象。 E.g。

val a = ...
val b = ...
val bWithKey = b.map(v => (v.key, v))
val joined = a.map(v => (v.key, v)).join(bWithKey)