簡體   English   中英

使用Apache Spark將MongoDB數據保存為鑲木地板文件格式

[英]Save MongoDB data to parquet file format using Apache Spark

我是Apache spark以及Scala編程語言的新手。

我想要實現的是從我的本地mongoDB數據庫中提取數據,然后使用Apache Spark和hadoop-connector將其保存為鑲木地板格式

到目前為止這是我的代碼:

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轉換為DataFrame,以便我可以以鑲木地板格式保存數據?

這是mongoDB集合中一個Document的結構: https ://gist.github.com/kingtrocko/83a94238304c2d654fe4

創建一個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)

這應該讓你去。 如果需要,我可以稍后解釋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM