Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将流式数据从spark接收到Mongodb?_Mongodb_Apache Spark_Pyspark - Fatal编程技术网

如何将流式数据从spark接收到Mongodb?

如何将流式数据从spark接收到Mongodb?,mongodb,apache-spark,pyspark,Mongodb,Apache Spark,Pyspark,我正在使用pyspark从Kafka读取流数据,然后我想将该数据接收到mongodb。我已经包含了所有必需的包,但是它抛出了一个错误 不支持操作异常:数据源com.mongodb.spark.sql.DefaultSource不支持流式写入 以下链接与我的问题无关 这是完整的错误堆栈跟踪 回溯(最近一次调用):文件“/home/b3ds/kafka spark.py”, 第85行,在 .option(“com.mongodb.spark.sql.DefaultSource”mongodb:/

我正在使用pyspark从Kafka读取流数据,然后我想将该数据接收到mongodb。我已经包含了所有必需的包,但是它抛出了一个错误
不支持操作异常:数据源com.mongodb.spark.sql.DefaultSource不支持流式写入

以下链接与我的问题无关

这是完整的错误堆栈跟踪

回溯(最近一次调用):文件“/home/b3ds/kafka spark.py”, 第85行,在 .option(“com.mongodb.spark.sql.DefaultSource”mongodb://localhost:27017/twitter.test")\ 文件 “/home/b3ds/hdp/spark/python/lib/pyspark.zip/pyspark/sql/streaming.py”, 开始文件中的第827行 “/home/b3ds/hdp/spark/python/lib/py4j-0.10.4-src.zip/py4j/java_gateway.py”, 第1133行,在调用文件中 “/home/b3ds/hdp/spark/python/lib/pyspark.zip/pyspark/sql/utils.py”, 第63行,在deco文件中 “/home/b3ds/hdp/spark/python/lib/py4j-0.10.4-src.zip/py4j/protocol.py”, 第319行,在get_return_值py4j.protocol.Py4JJavaError中:一个错误 调用o122.start时发生: java.lang.UnsupportedOperationException:数据源 com.mongodb.spark.sql.DefaultSource不支持流式写入 位于org.apache.spark.sql.execution.datasources.DataSource.createSink(DataSource.scala:287) 位于org.apache.spark.sql.streaming.DataStreamWriter.start(DataStreamWriter.scala:272) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处 位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中 位于java.lang.reflect.Method.invoke(Method.java:498) 位于py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244) 位于py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357) 在py4j.Gateway.invoke处(Gateway.java:280) 位于py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132) 在py4j.commands.CallCommand.execute(CallCommand.java:79) 在py4j.GatewayConnection.run处(GatewayConnection.java:214) 运行(Thread.java:748)

这是我的Pypark代码

from __future__ import print_function
import sys
from pyspark.sql.functions import udf
from pyspark.sql import SparkSession
from pyspark import SparkContext
from pyspark.streaming import StreamingContext
from pyspark.streaming.kafka import KafkaUtils
from pyspark.sql.types import StructType
from pyspark.sql.types import *
import json
from pyspark.sql.functions import struct
from pyspark.sql.functions import *
import datetime

json_schema = StructType([
  StructField("twitterid", StringType(), True),
  StructField("created_at", StringType(), True),
  StructField("tweet", StringType(), True),
  StructField("screen_name", StringType(), True)
])

def parse_json(df):
    twitterid   = json.loads(df[0])['id']
    created_at  = json.loads(df[0])['created_at']
    tweet       = json.loads(df[0])['text']
    tweet       = json.loads(df[0])['text']
    screen_name = json.loads(df[0])['user']['screen_name']
    return [twitterid, created_at, tweet, screen_name]

def convert_twitter_date(timestamp_str):
    output_ts = datetime.datetime.strptime(timestamp_str.replace('+0000 ',''), '%a %b %d %H:%M:%S %Y')
    return output_ts

if __name__ == "__main__":

        spark = SparkSession\
                        .builder\
                        .appName("StructuredNetworkWordCount")\
                        .config("spark.mongodb.input.uri","mongodb://192.168.1.16:27017/twitter.test")\
                        .config("spark.mongodb.output.uri","mongodb://192.168.1.16:27017/twitter.test")\
                        .getOrCreate()
        events = spark\
                        .readStream\
                        .format("kafka")\
                        .option("kafka.bootstrap.servers", "localhost:9092")\
                        .option("subscribe", "twitter")\
                        .load()
        events = events.selectExpr("CAST(value as String)")

        udf_parse_json = udf(parse_json , json_schema)
        udf_convert_twitter_date = udf(convert_twitter_date, TimestampType())
        jsonoutput = events.withColumn("parsed_field", udf_parse_json(struct([events[x] for x in events.columns]))) \
                                        .where(col("parsed_field").isNotNull()) \
                                        .withColumn("created_at", col("parsed_field.created_at")) \
                                        .withColumn("screen_name", col("parsed_field.screen_name")) \
                                        .withColumn("tweet", col("parsed_field.tweet")) \
                                        .withColumn("created_at_ts", udf_convert_twitter_date(col("parsed_field.created_at")))

        windowedCounts = jsonoutput.groupBy(window(jsonoutput.created_at_ts, "1 minutes", "15 seconds"),jsonoutput.screen_name)$

        mongooutput = jsonoutput \
                        .writeStream \
                        .format("com.mongodb.spark.sql.DefaultSource")\
                        .option("com.mongodb.spark.sql.DefaultSource","mongodb://localhost:27017/twitter.test")\
                        .start()
        mongooutput.awaitTermination()
我看过mongodb文档,文档中说它支持spark到mongo sink

我看过mongodb文档,其中说它支持spark到mongo sink

文档声称,您可以使用标准的
RDD
API,使用遗留流(
DStream
)API编写每个RDD


这并不意味着MongoDB支持结构化流媒体,它也不支持。由于您使用PySpark,而PySpark不可访问,因此您必须等待,直到(如果有的话)MongoDB包被更新以支持流式操作。

您让它工作了吗?我也有类似的问题。嗨,你解决问题了吗?