我有一个mydata:RDD [Vertex],其中每个Vertex都有一个id属性。我还在dbdata中有来自mysql的数据:JdbcRDD [String],其中每个字符串中的第一个位置被一个与RDD集合中的Vertex.id匹配的id值占用。
我想用JdbcRDD [String]中的数据填充每个Vertex的变量,但我没有更有效的方法来匹配这两个数据集。我正在尝试这个但它不起作用:
mydata.map(x => val arow = dbdata.filter { y => y.split(",")(0).toString == x.id }.collect
x.prop1 = arow(1)
// ... for all other values in arow
)
然而,我得到了一个
org.apache.spark.SparkException: RDD transformations and actions can only be invoked by the driver, not inside of other transformations;
所以我猜我的做法是错误的......
答案 0 :(得分:2)
您的问题听起来非常适合加入操作。以下代码片段应该可以解决这个问题
val mydata: RDD[Vertex] = ...
val dbdata: JdbcRDD[String] = ...
val mydataKV = mydata.map(x => (x.id, x))
val dbdataKV = dbdata.map(x => ((x.split(",")(0), x)))
val result = mydataKV.join(dbdataKV).mapValues{
case (vertex, db) =>
// fill vertex fields
vertex.prop1 = db.split(",")(1)
...
vertex
}