我是Apache spark以及Scala编程语言的新手。
我想要实现的是从我的本地mongoDB数据库中提取数据然后使用带有hadoop-connector的Apache Spark将其保存在parquet format
这是我的代码到目前为止:
package com.examples
import org.apache.spark.{SparkContext, SparkConf}
import org.apache.spark.rdd.RDD
import org.apache.hadoop.conf.Configuration
import org.bson.BSONObject
import com.mongodb.hadoop.{MongoInputFormat, BSONFileInputFormat}
import org.apache.spark.sql
import org.apache.spark.sql.SQLContext
object DataMigrator {
def main(args: Array[String])
{
val conf = new SparkConf().setAppName("Migration App").setMaster("local")
val sc = new SparkContext(conf)
val sqlContext = new SQLContext(sc)
// Import statement to implicitly convert an RDD to a DataFrame
import sqlContext.implicits._
val mongoConfig = new Configuration()
mongoConfig.set("mongo.input.uri", "mongodb://localhost:27017/mongosails4.case")
val mongoRDD = sc.newAPIHadoopRDD(mongoConfig, classOf[MongoInputFormat], classOf[Object], classOf[BSONObject]);
val count = countsRDD.count()
// the count value is aprox 100,000
println("================ PRINTING =====================")
println(s"ROW COUNT IS $count")
println("================ PRINTING =====================")
}
}
问题在于,为了将数据保存为镶木地板文件格式,首先必须将mongoRDD变量转换为Spark DataFrame。我尝试过这样的事情:
// convert RDD to DataFrame
val myDf = mongoRDD.toDF() // this lines throws an error
myDF.write.save("my/path/myData.parquet")
我得到的错误是这样的:
Exception in thread "main" scala.MatchError: java.lang.Object (of class scala.reflect.internal.Types.$TypeRef$$anon$6)
你们有什么想法我怎样才能将RDD转换为数据框架,这样我才能以镶木地板格式保存数据?
这里是mongoDB集合中一个Document的结构:https://gist.github.com/kingtrocko/83a94238304c2d654fe4
答案 0 :(得分:1)
创建一个Case类,表示存储在DBObject中的数据
case class Data(x: Int, s: String)
然后,将rdd的值映射到案例类的实例。
val dataRDD = mongoRDD.values.map { obj => Data(obj.get("x"), obj.get("s")) }
现在使用RDD [Data],您可以使用sqlContext
创建一个DataFrame val myDF = sqlContext.createDataFrame(dataRDD)
这应该让你去。如果需要,我可以稍后解释。