我正在使用spark streaming,我开发了以下spark spark应用程序:
从Kafka接收器(RDD1)创建DStream,从HTTP请求创建另一个DStream(RDD2)。
我的问题是我想只使用RDD1中的第一个元素并在我的RDD2中使用它,而且这个代码不能用于火花流(.first())如何使用spark streaming 1.6获得相同的结果
代码:
firstLineRDD = kvs.map(lambda x : x[0], x[1].split('\n')[0], x[2])
dateRDD = firstLineRDD.map(lambda x : (datetime.datetime.fromtimestamp(float(x[0])/1000000),x[1],x[2]))
dayAggRDD = dateRDD.map(lambda x : (x[0],x[1],x[2]))
daily_date, sys , metric = dayAggRDD.first()
dataTSRDD = sc.parallelize(apiRequest(sys,metric,getDailyDate(daily_date)))
答案 0 :(得分:0)
我在这里使用了两个Kafka流,但它与你的用例几乎相同。(在java中).Have将流转换为数据集,然后你可以获取第一个数据集的第一个元素,然后使用值来操作第二个。以下是代码的简要摘要:
DstreamCoord.foreachRDD(new VoidFunction<JavaRDD<Coordinates>>() {
String valueA;
String valueB;
public void call(JavaRDD<Coordinates> arg0) throws Exception {
// TODO Auto-generated method stub
RDD<Coordinates> d = arg0.rdd();
Dataset<Row> dataset1 = session.createDataFrame(d, Coordinates.class);
Row firstElement = dataset1.first();
valueA = firstElement.getString(1);
valueB = firstElement.getString(1);
JavaInputDStream<ConsumerRecord<String, String>> stream2 =
org.apache.spark.streaming.kafka010.KafkaUtils.createDirectStream(
StreamingContext,
LocationStrategies.PreferConsistent(),
ConsumerStrategies.<String, String>Subscribe(topics, kafkaParams)
);
stream2.foreachRDD(new VoidFunction<JavaRDD<ConsumerRecord<String,String>>>() {
public void call(JavaRDD<ConsumerRecord<String, String>> arg0) throws Exception {
// TODO Auto-generated method stub
Dataset<Row> dataset2 = session.createDataFrame(arg0.rdd(), Coordinates.class);
}
});