我正在尝试使用来自 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的)函数。
有人可以帮助我纠正这个错误并实现我想要做的事情吗?
答案 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);
}
});
});
由于