如果我们要想通过Spark来处理MongoDB中数据,可以采用以下3种方式:
- Spark直连MongoDB
- Hive中创建映射表
- 使用MongoDB Export导出文件
Spark直连MongoDB
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>
1. 通过SparkConf
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()
2. 通过ReadConfig
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()
3. 通过DataFrameReader
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中创建映射表
这种方式是先通过在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导出文件
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")