我正在尝试将spark(pyspark)连接到mongodb,如下所示:
conf = SparkConf()
conf.set('spark.mongodb.input.uri', default_mongo_uri)
conf.set('spark.mongodb.output.uri', default_mongo_uri)
sc = SparkContext(conf=conf)
sqlContext = SQLContext(sc)
spark = SparkSession \
.builder \
.appName("my-app") \
.config("spark.mongodb.input.uri", default_mongo_uri) \
.config("spark.mongodb.output.uri", default_mongo_uri) \
.getOrCreate()
但是当我执行以下操作时:
users = spark.read.format("com.mongodb.spark.sql.DefaultSource") \
.option("uri", '{uri}.{col}'.format(uri=mongo_uri, col='users')).load()
我收到此错误:
java.lang.ClassNotFoundException:无法找到数据源: com.mongodb.spark.sql.DefaultSource
我在pyspark shell中做了同样的事情,并且能够检索数据。这是我运行的命令:
pyspark --conf "spark.mongodb.input.uri=mongodb_uri" --conf "spark.mongodb.output.uri=mongodburi" --packages org.mongodb.spark:mongo-spark-connector_2.11:2.2.2
但是在这里,我们可以选择指定我们需要使用的软件包。但是独立应用程序和脚本呢?如何在那里配置mongo-spark-connector。
有什么想法吗?
答案 0 :(得分:1)
当尝试从Spark(2.3)连接到MongoDB时,我也遇到相同的错误“ java.lang.ClassNotFoundException:无法找到数据源:com.mongodb.spark.sql.DefaultSource”。
我必须下载 mongo-spark-connector_2.11 JAR文件并将其复制到spark安装的 jars 目录中。
这解决了我的问题,我可以通过spark-submit成功调用我的spark代码。
希望有帮助。
答案 1 :(得分:0)
您没有使用sc创建SparkSession。也许这段代码可以帮助您:
conf.set('spark.mongodb.input.uri', mongodb_input_uri)
conf.set('spark.mongodb.input.collection', 'collection_name')
conf.set('spark.mongodb.output.uri', mongodb_output_uri)
sc = SparkContext(conf=conf)
spark = SparkSession(sc) # Using the context (conf) to create the session
答案 2 :(得分:0)
这是我在Jupyter笔记本中做的事情:
1.从中央或任何其他存储库下载jar,并将其放在名为“ jars”的目录中:
mongo-spark-connector_2.11-2.4.0
mongo-java-driver-3.9.0
2.创建会话并写入/读取任何数据
from pyspark import SparkConf
from pyspark.sql import SparkSession
from pyspark.sql.functions import *
from pyspark.sql.types import *
working_directory = 'jars/*'
my_spark = SparkSession \
.builder \
.appName("myApp") \
.config("spark.mongodb.input.uri=mongodb://127.0.0.1/test.myCollection") \
.config("spark.mongodb.output.uri=mongodb://127.0.0.1/test.myCollection") \
.config('spark.driver.extraClassPath', working_directory) \
.getOrCreate()
people = my_spark.createDataFrame([("JULIA", 50), ("Gandalf", 1000), ("Thorin", 195), ("Balin", 178), ("Kili", 77),
("Dwalin", 169), ("Oin", 167), ("Gloin", 158), ("Fili", 82), ("Bombur", 22)], ["name", "age"])
people.write.format("com.mongodb.spark.sql.DefaultSource").mode("append").save()
df = my_spark.read.format("com.mongodb.spark.sql.DefaultSource").load()
df.select('*').where(col("name") == "JULIA").show()
答案 3 :(得分:0)
如果您使用的是 SparkContext&SparkSession ,则在SparkConf中提到了连接器jar包,请检查以下代码:
from pyspark import SparkContext,SparkConf
conf = SparkConf().set("spark.jars.packages", "org.mongodb.spark:mongo-spark-connector_2.11:2.3.2")
sc = SparkContext(conf=conf)
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName("myApp") \
.config("spark.mongodb.input.uri", "mongodb://xxx.xxx.xxx.xxx:27017/sample1.zips") \
.config("spark.mongodb.output.uri", "mongodb://xxx.xxx.xxx.xxx:27017/sample1.zips") \
.getOrCreate()
df = spark.read.format("com.mongodb.spark.sql.DefaultSource").load()
df.printSchema()
如果您仅使用 SparkSession ,请使用以下代码:
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName("myApp") \
.config("spark.mongodb.input.uri", "mongodb://xxx.xxx.xxx.xxx:27017/sample1.zips") \
.config("spark.mongodb.output.uri", "mongodb://xxx.xxx.xxx.xxx:27017/sample1.zips") \
.config('spark.jars.packages', 'org.mongodb.spark:mongo-spark-connector_2.11:2.3.2') \
.getOrCreate()
df = spark.read.format("com.mongodb.spark.sql.DefaultSource").load()
df.printSchema()