我有一个分析BSON转储的脚本,但它只适用于未压缩的文件。我在读取gz bson文件时得到一个空的RDD。
pyspark_location = 'lib/pymongo_spark.py'
HDFS_HOME = 'hdfs://1.1.1.1/'
INPUT_FILE = 'big_bson.gz'
class BsonEncoder(JSONEncoder):
def default(self, obj):
if isinstance(obj, ObjectId):
return str(obj)
elif isinstance(obj, datetime):
return obj.isoformat()
return JSONEncoder.default(self, obj)
def setup_spark_with_pymongo(app_name='App'):
conf = SparkConf().setAppName(app_name)
sc = SparkContext(conf=conf)
sc.addPyFile(pyspark_location)
return sc
def main():
spark_context = setup_spark_with_pymongo('PysparkApp')
filename = HDFS_HOME + INPUT_FILE
import pymongo_spark
pymongo_spark.activate()
rdd = spark_context.BSONFileRDD(filename)
print(rdd.first()) #Raises ValueError("RDD is empty")
我正在使用mongo-java-driver-3.2.2.jar,mongo-hadoop-spark-1.5.2.jar,pymongo-3.2.2-py2.7-linux-x86_64和pymongo_spark以及spark-提交。 部署的Spark版本是1.6.1以及Hadoop 2.6.4。
我知道该库不支持拆分压缩的BSON文件,但它应该只进行一次拆分。 我有数百个压缩的BSON文件需要进行分析,并且每个文件的放气并不是一个可行的选择。
知道我该怎么办? 提前谢谢!
答案 0 :(得分:0)
我刚刚在环境中测试过:mongo-hadoop-spark-1.5.2.jar
,适用于Hadoop 2.6.4,Pymongo 3.2.2的Spark版本1.6.1。源文件是mongodump compressed的输出,是单个拆分的小尺寸文件(未压缩的集合大小为105MB)。穿过PySpark:
from pyspark import SparkContext, SparkConf
import pymongo_spark
pymongo_spark.activate()
conf = SparkConf().setAppName("pyspark-bson")
file_path = "/file/example_bson.gz"
rdd = sc.BSONFileRDD(file_path)
rdd.first()
能够读取压缩的BSON文件,并列出第一个文档。请确保您可以访问输入文件,并且文件格式正确。