如何将火花RDD与JdbcRDD

时间:2015-11-18 15:41:38

标签: scala apache-spark rdd

我有一个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; 

所以我猜我的做法是错误的......

1 个答案:

答案 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
}