Spark直连MongoDB有以下3种方式,所需要的Maven依赖:
<dependency> <groupId>org.mongodb.spark</groupId> <artifactId>mongo-spark-connector_2.11</artifactId> <version>2.4.0</version> </dependency> <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java-driver</artifactId> <version>3.12.7</version> </dependency>MongoDB相关配置在SparkSession初始化时配置,实现代码:
val spark = SparkSession .builder() .appName("Spark-MongoDB") .config("spark.mongodb.input.uri", "mongodb://username:password@host/db_name.collection_name?authSource=admin") .config("spark.mongodb.input.partitioner", "MongoSamplePartitioner") .enableHiveSupport() .getOrCreate() val rdd: MongoRDD[Document = MongoSpark.load(spark.sparkContext) spark.close()MongoDB相关配置通过com.mongodb.spark.config.ReadConfig类进行配置,实现代码:
val spark = SparkSession .builder() .appName("Spark-MongoDB") .enableHiveSupport() .getOrCreate() import com.mongodb.spark.config._ val readConfig = ReadConfig( Map( "uri" -> "mongodb://username:password@host/", "database" -> "db_name", "collection" -> "collection_name" ) ) val rdd: MongoRDD[Document] = MongoSpark.load(spark.sparkContext, readConfig) spark.close()MongoDB相关配置通过Spark DataFrameReader进行配置,实现代码:
val spark = SparkSession .builder() .appName("Spark-MongoDB") .enableHiveSupport() .getOrCreate() val df: DataFrame = spark.read .format("com.mongodb.spark.sql.DefaultSource") .option("uri", "mongodb://username:password@host/db_name.collection_name?authSource=admin") .load() spark.close()这种方式是先通过在Hive中创建MongoDB中要读取的collection所对应的映射表,然后用Spark读取这个映射表就可以获取MongoDB中的数据了。这种创建映射表的方式,数据还是存储在MongoDB中的,Hive中没有任何原始数据,只有对应的映射表。
第一步:创建映射表需要如下依赖包,需要将jar包复制到Hive安装目录的lib文件夹下
mongo-hadoop-core-2.0.2.jar mongo-hadoop-hive-2.0.2.jar mongo-java-driver-3.8.0.jar第二步:在Hive中创建映射表
create table rds.sdhh_contacts_mongo( user_id string, user_name string, updated_at timestamp, created_at timestamp ) stored by 'com.mongodb.hadoop.hive.mongostoragehandler' with serdeproperties('mongo.columns.mapping'='{"user_id":"user_name","created_at":"created_at"}') tblproperties('mongo.uri'='mongodb://username:password@host:port/dbname.table?authsource=admin');mongoexport是MongoDB的一个命令行工具,可以将MongoDB中的collection数据导出为JOSN或CSV文件。然后再将这些文件上传到HDFS上,就可以用Spark进行解析了。
具体步骤如下:
MongoDB安装目录下执行mongoexport命令,导出collection到本地
./mongoexport --host host_name --port port_no -u user_name -p password -d db_name -c collection_anme -f col1,col2 -q '{"startupTime":{$gte:ISODate("2020-09-17T16:00:00.000Z"),$lte:ISODate("2020-09-18T15:59:59.999Z")}}' -o /opt/export.json –host:MongoDB安装的主机名–port:MongoDB进程端口号-u:用户名-p:密码-d:数据库名-c:collection名-f:指定要查询的列-q:指定查询条件-o:指定输出文件上传导出的json文件到HDFS
hadoop fs -put /opt/export.json /Spark读取HDFS文件并处理
val df: DataFrame = spark.read.json("/export.json")