Spark——Spark读写MongoDB

文章目录

  • Spark直连MongoDB
    • 1. 通过SparkConf
    • 2. 通过ReadConfig
    • 3. 通过DataFrameReader
  • Hive中创建映射表
  • mongoexport导出文件
  • 参考

如果我们要想通过Spark来处理MongoDB中数据,可以采用以下3种方式:

  1. Spark直连MongoDB
  2. Hive中创建映射表
  3. 使用MongoDB Export导出文件

Spark直连MongoDB

Spark直连MongoDB有以下3种方式,所需要的Maven依赖:

<dependency>
    <groupId>org.mongodb.sparkgroupId>
    <artifactId>mongo-spark-connector_2.11artifactId>
    <version>2.4.0version>
dependency>

<dependency>
    <groupId>org.mongodbgroupId>
    <artifactId>mongo-java-driverartifactId>
    <version>3.12.7version>
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进行解析了。

具体步骤如下:

  1. 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:指定输出文件
  2. 上传导出的json文件到HDFS

    hadoop fs -put /opt/export.json /
    
  3. Spark读取HDFS文件并处理

    val df: DataFrame = spark.read.json("/export.json")
    

参考

  1. https://docs.mongodb.com/spark-connector/v2.4/scala/read-from-mongodb
  2. https://docs.mongodb.com/spark-connector/v2.4/configuration#std-label-spark-output-conf
  3. https://github.com/mongodb/mongo-spark
  4. https://docs.mongodb.com/database-tools/mongoexport/#bin.mongoexport

你可能感兴趣的:(Spark,Spark,MongoDB)