Apache spark 如何在两个模式RDD上执行联接操作?
我有两个SchemaRDD,我想对它们执行连接操作(与sqljoin相同)。 请帮帮我。从 在(K,V)类型的数据集上调用时加入(otherDataset,[numTasks]) 和(K,W),返回(K,(V,W))对的数据集,其中包含 每个键的元素。外部联接也支持通过 左外联和右外联 您可能希望通过映射转换来运行schemaRDDs,将它们放在Apache spark 如何在两个模式RDD上执行联接操作?,apache-spark,rdd,Apache Spark,Rdd,我有两个SchemaRDD,我想对它们执行连接操作(与sqljoin相同)。 请帮帮我。从 在(K,V)类型的数据集上调用时加入(otherDataset,[numTasks]) 和(K,W),返回(K,(V,W))对的数据集,其中包含 每个键的元素。外部联接也支持通过 左外联和右外联 您可能希望通过映射转换来运行schemaRDDs,将它们放在(K,V)表单中:K是您想要加入的键,而V可以是整行对象。例如 val a = ... val b = ... val bWithKey = b.map
(K,V)
表单中:K
是您想要加入的键,而V
可以是整行对象。例如
val a = ...
val b = ...
val bWithKey = b.map(v => (v.key, v))
val joined = a.map(v => (v.key, v)).join(bWithKey)
从
在(K,V)类型的数据集上调用时加入(otherDataset,[numTasks])
和(K,W),返回(K,(V,W))对的数据集,其中包含
每个键的元素。外部联接也支持通过
左外联和右外联
您可能希望通过映射转换来运行schemaRDDs,将它们放在(K,V)
表单中:K
是您想要加入的键,而V
可以是整行对象。例如
val a = ...
val b = ...
val bWithKey = b.map(v => (v.key, v))
val joined = a.map(v => (v.key, v)).join(bWithKey)
如果将这两个Schemards注册为表,那么实际上可以执行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)
另一种不需要注册的方法是使用语言集成语法(有人怀疑有一种方法可以简化这一过程):
如果将这两个Schemards注册为表,那么实际上可以执行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)
另一种不需要注册的方法是使用语言集成语法(有人怀疑有一种方法可以简化这一过程):