通过流功能流动时间戳

时间:2016-10-25 10:58:49

标签: java apache-spark batch-processing spark-streaming

每次使用Spark Streaming运行批处理时,如何/是否可以生成随机数或获取系统时间?

我有两个处理一批消息的函数: 1 - 首先处理密钥,创建文件(csv)并写入标头 2 - 第二个处理每个消息并将数据添加到csv

我希望将每个批处理的文件存储在不同的文件夹中:

/output/folderBatch1/file1.csv, file2.csv, etc.csv
/output/folderBatch2/file1.csv, file2.csv, etc.csv
/output/folderBatch3/file1.csv, file2.csv, etc.csv

如何创建变量,甚至只是Spark Streaming可以使用的简单计数器?

下面的代码获取系统时间,但因为它是普通的Java'它只执行一次,并且在批次的每次运行中都是相同的值。

JavaPairInputDStream<String, byte[]> messages;
messages = KafkaUtils.createDirectStream(
        jssc,
        String.class,
        byte[].class,
        StringDecoder.class,
        DefaultDecoder.class,
        kafkaParams,
        topicsSet
);

/**
 * Declare what computation needs to be done
 */
JavaPairDStream<String, Iterable<byte[]>> groupedMessages = messages.groupByKey();

String time = Long.toString(System.currentTimeMillis());        //this is only ever run once and is the same value for each batch!

groupedMessages.map(new WriteHeaders(time)).print();

groupedMessages.map(new ProcessMessages(time)).print();

谢谢你, KA。

1 个答案:

答案 0 :(得分:1)

您可以通过额外的map调用添加时间戳并将其传递给它。这意味着您的Iterable<byte[]>值不是Tuple2<Long, Iterable<byte[]>),而是价值JavaDStream<Tuple2<String, Tuple2<Long, Iterable<byte[]>>>> groupedWithTimeStamp = groupedMessages .map((Function<Tuple2<String, Iterable<byte[]>>, Tuple2<String, Tuple2<Long, Iterable<byte[]>>>>) kvp -> new Tuple2<>(kvp._1, new Tuple2<>(System.currentTimeMillis(), kvp._2)));

map

现在,从现在开始,每个groupedWithTimeStamp.map(value -> value._2._1); // This will access the timestamp. 都有你的时间戳,你可以通过以下方式访问它:

select cast(convert(varchar,  SUBSTRING(OBXDateTime, 1, 4) + '-' +  
SUBSTRING(OBXDateTime, 5, 2) + '-' + 
SUBSTRING(OBXDateTime, 7, 2) + ' ' +  
SUBSTRING(OBXDateTime, 9, 2) + ':' +
SUBSTRING(OBXDateTime, 11, 2) + ':' +
SUBSTRING(OBXDateTime, 13, 2), 101) as datetime) from ObservationPatInfo