火花中不同Kafka Direct Stream功能之间的透明度

时间:2015-10-14 08:53:10

标签: scala apache-spark apache-kafka

我正在使用Kafka直接流编写一个简单的火花流工作。可以使用两种方法创建Kafka直接流。

  1. 从Kafka Params取消 -

    {-# LANGUAGE FlexibleInstances #-} data A = A -- could be anything class C f where takeA :: f -> A -> A instance C A where takeA a = \_ -> a instance C b => C (A -> b) where takeA f = \x -> takeA (f x) x

  2. 供应抵消 -

    createDirectStream[K, V, KD <: Decoder[K], VD <: Decoder[V]](jssc: JavaStreamingContext, keyClass: Class[K], valueClass: Class[V], keyDecoderClass: Class[KD], valueDecoderClass: Class[VD], kafkaParams: Map[String, String], topics: Set[String]): JavaPairInputDStream[K, V]

  3. 从定义中可以看出,两种函数的返回类型是不同的。我想在上面的一个函数上创建一个基于map的方法,如果为空则应该恢复到第二个方法,否则使用第一个方法来创建流。但是,由于这两个函数具有不同的返回类型,因此我的其余代码不能保持透明,因为directStream是如何创建的。是否有更优雅的方式来实现这一目标?

1 个答案:

答案 0 :(得分:1)

好吧,我很愚蠢。只是张贴这个以防其他人卡住。您可以通过函数指定偏移量:

createDirectStream[K, V, KD <: Decoder[K], VD <: Decoder[V], R](jssc: JavaStreamingContext, keyClass: Class[K], valueClass: Class[V], keyDecoderClass: Class[KD], valueDecoderClass: Class[VD], recordClass: Class[R], kafkaParams: Map[String, String], fromOffsets: Map[TopicAndPartition, Long], messageHandler: Function[MessageAndMetadata[K, V], R]): JavaInputDStream[R]

输出流包含数据类型JavaInputDStream[R]。所需要的只是提供一个有效地从MessageAndMetadata[K,V]转换为R的函数。这可以通过构造函数中的函数messageHandler来实现。我所要做的就是添加以下行作为messageHandler。

(mmd: MessageAndMetadata[String, String]) => (mmd.key() -> mmd.message())

我需要Tuple2。您可以将其转换为您希望的任何数据类型。