利用saprk 处理mongodb数据库中的数据,从根上来说就是用spark 处理解析json数据,大致分为两步,第一步呢就是利用spark 从mongodb中加载数据到spark中,第二部就是用spark sql中个中查询方法、函数来处理加载过来的数据。
具体代码如下:
1.从mongodb中加载数据到spark
SparkConf conf = new SparkConf().setAppName("mongo").setMaster("local[3]")
// .set("spark.mongodb.input.uri", "mongodb://192.168.4.24/credential.course_credential");
.set("spark.mongodb.input.uri","mongodb://192.168.4.24/search.docs");
JavaSparkContext jsc = new JavaSparkContext(conf);
2.对加载过来的数据进行处理,对于加载过来的数据,笔者将数据大概分为Object,array,map 三种类型的数据,对于Object类型的数据呢,我们可以直接用xx.attr就可以直接访问,但是对于map和array两种类型的数据呢我们需要借助explode函数将array或map类型的数据处理之后,然后在用xx.attr才可以访问。具体示例代码如下:
SQLContext sqlContext = SQLContext.getOrCreate(jsc.sc());
DataFrame df = MongoSpark.load(jsc).toDF(Docs.class);
df.registerTempTable("docs");
df.printSchema();
DataFrame mtable=sqlContext.sql("select _id.oid,description,name,timestamp,type,videoName from docs");
DataFrame idtable=sqlContext.sql("select _id.oid,id.course,id.org, id.names.caption,id.names.course,id.names.vertical,id.names.video from docs");
//这个地方时处理array、map类型json数据的关键
DataFrame idsTable=df.select(df.col("_id.oid"),org.apache.spark.sql.functions.explode(df.col("ids").as("courseids")));
DataFrame newss=idsTable.select("oid","col.org","col.course","col.names.course");
newss.printSchema();
mtable.show(2,false);
idtable.show(10,false);
newss.show(10,false);