31.
Spark 读取mongo 使用withPipeline的用法:
在工作中遇到过需要从一个公司列表中找出mongo中存在的公司信息。参考Mongo语法 $in可支持这个用法
https://docs.mongodb.com/manual/reference/operator/query/in/
需要配合spark的.withPipeline来使用。
https://docs.mongodb.com/spark-connector/current/scala/aggregation/
pipeline需要给出的条件是字符串,所以需要对一些字段转换成字符串即可
【 scala 的 mkstring 用法 https://blog.youkuaiyun.com/lan12334321234/article/details/84882002】
下面贴出关键的代码。
#dataFrame都只有公司名
val addCompanyNameArray = entryCompanyNameDF.except(stgCompanyNameDF).map(r => r.getString(0)).collect.toArray
#将公司Array转为字符串
// 将Array转换成String
var addCompanyNameStr = addCompanyNameArray.mkString("\"", "\",\"", "\"")
#读取Mongo的过程不做赘述
#下面 withPipeline 配合 $in来使用
val df = sc.loadFromMongoDB(readconf).withPipeline(Seq(Document.parse("{ $match: { 'name' : {$in : [" + addCompanyNameStr + "]} } }"))).toDF(schema)
此贴来自汇总贴的子问题,只是为了方便查询。
总贴请看置顶帖:
pyspark及Spark报错问题汇总及某些函数用法。
https://blog.youkuaiyun.com/qq0719/article/details/86003435