将流数据集附加到Spark

时间:2016-10-03 01:23:20

标签: apache-spark apache-spark-sql apache-spark-2.0 spark-structured-streaming

我们在Spark中有一个用例,我们希望将数据库中的历史数据加载到Spark并继续向Spark添加新的流数据,然后我们可以对整个最新的数据集进行分析。

据我所知,Spark SQL和Spark Streaming都不能将历史数据与流数据结合起来。然后我发现Spark 2.0中的Structured Streaming似乎是为这个问题而构建的。但经过一些实验,我仍然无法弄明白。这是我的代码:

SparkSession spark = SparkSession
        .builder()
        .config(conf)
        .getOrCreate();

JavaSparkContext jsc = new JavaSparkContext(spark.sparkContext());

// Load historical data from MongoDB
JavaMongoRDD<Document> mongordd = MongoSpark.load(jsc);


// Create typed dataset with customized schema
JavaRDD<JavaRecordForSingleTick> rdd = mongordd.flatMap(new FlatMapFunction<Document, JavaRecordForSingleTick>() {...});
Dataset<Row> df = spark.sqlContext().createDataFrame(rdd, JavaRecordForSingleTick.class);
Dataset<JavaRecordForSingleTick> df1 = df.as(ExpressionEncoder.javaBean(JavaRecordForSingleTick.class));


// ds listens to a streaming data source
Dataset<Row> ds = spark.readStream()
        .format("socket")
        .option("host", "127.0.0.1")
        .option("port", 11111)
        .load();

// Create the typed dataset with customized schema
Dataset<JavaRecordForSingleTick> ds1 = ds
        .as(Encoders.STRING())
        .flatMap(new FlatMapFunction<String, JavaRecordForSingleTick>() {
    @Override
    public Iterator<JavaRecordForSingleTick> call(String str) throws Exception {
    ...
    }
}, ExpressionEncoder.javaBean(JavaRecordForSingleTick.class));


// ds1 and df1 have the same schema. ds1 gets data from the streaming data source, df1 is the dataset with historical data

ds1 = ds1.union(df1);
StreamingQuery query = ds1.writeStream().format("console").start();
query.awaitTermination();

我收到错误“org.apache.spark.sql.AnalysisException:不支持流和批量DataFrames / Datasets之间的联合;”当我union()两个数据集时。

有人可以帮帮我吗?我会走向错误的方向吗?

1 个答案:

答案 0 :(得分:1)

在支持这种类型的功能方面,我不能代表MongoDB spark连接器,Google上似乎没有太多关于它的信息。但是,Spark数据库生态系统中还有其他数据库可以执行此操作。我在another answer中介绍了Spark数据库生态系统中的大部分内容。我不能确切地说明哪个数据库很容易允许您正在寻找的功能类型,但我知道SnappyDataMemSQL在该列表中。但是,您可能需要两种关系形式的数据。