我有两个SchemaRDD,我想对它们执行连接操作(与SQL连接相同)。 请帮帮我。
答案 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)
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)