在Java中将JavaPairDStream转换为Tuple3

时间:2017-05-11 20:46:08

标签: apache-spark

我正在尝试使用来自 Kafka 的数据并生成 Cassandra 的Spark作业。

我正在处理的样本在给定的时间间隔内收集了大量单词,并将单词count发布到 Cassandra 。我还尝试发布时间戳以及及其计数

到目前为止我所拥有的内容如下:

Tuple3<String, Date, Integer> finalRecord =
            wordCounts.map(s -> new Tuple3<>(s._1(), new Date().getTime(), s._2()));

现在我正在尝试将时间戳附加到这些记录中。我试过的是这样的:

{{1}}

我的IDE当然显示错误。我完全不熟悉使用Spark库并以这种形式编写(我认为基于lambda的)函数。

有人可以帮助我纠正这个错误并实现我想要做的事情吗?

1 个答案:

答案 0 :(得分:0)

在网上进行了一些搜索并研究了一些例子后,我能够实现我想要的目标。

为了将时间戳属性附加到具有两个值的现有元组,我必须创建一个简单的bean来表示我的 Cassandra 排。

public static class WordCountRow implements Serializable {
        String word = "";
        long timestamp;
        Integer count = 0;

然后,我将 JavaPairDStream 结构中的(word,count) Tuple2 对象映射到 JavaDStream 保存上述 WordCountRow 类对象的结构。

JavaDStream<WordCountRow> wordCountRows = wordCounts.map((Function<Tuple2<String, Integer>, WordCountRow>)
                tuple -> new WordCountRow(tuple._1, new Date().getTime(), tuple._2));

最后,我可以在此结构上调用 foreachRDD 方法(返回 WordCountRow 的对象)我可以写入 Cassandra 一个接一个。

wordCountRows.foreachRDD((VoidFunction2<JavaRDD<WordCountRow>,Time>)(rdd,time)->{
            final SparkConf sc=rdd.context().getConf();
            final CassandraConnector cc=CassandraConnector.apply(sc);
            rdd.foreach((VoidFunction<WordCountRow>)wordCount->{
                try(Session session=cc.openSession()){
                    String query=String.format(Joiner.on(" ").join(
                            "INSERT INTO test_keyspace.word_count",
                            "(word, ts, count)",
                            "VALUES ('%s', %s, %s);"),
                            wordCount.word,wordCount.timestamp,wordCount.count);

                    session.execute(query);
                }
            });
        });

由于