Scala 重载的方法值createDirectStream,带有可选项

Scala 重载的方法值createDirectStream,带有可选项,scala,apache-spark,apache-kafka,spark-streaming,spark-streaming-kafka,Scala,Apache Spark,Apache Kafka,Spark Streaming,Spark Streaming Kafka,我的spark版本是1.6.2,卡夫卡版本是0.10.1.0。我想发送一个自定义对象作为卡夫卡值类型,并尝试将此自定义对象推送到卡夫卡主题中。并使用spark streaming读取数据。我用的是直接法。以下是我的代码: import com.xxxxx.kafka.{KafkaJsonDeserializer, KafkaObjectDecoder, pharmacyData} import kafka.serializer.StringDecoder import org.apache.sp

我的spark版本是1.6.2,卡夫卡版本是0.10.1.0。我想发送一个自定义对象作为卡夫卡值类型,并尝试将此自定义对象推送到卡夫卡主题中。并使用spark streaming读取数据。我用的是直接法。以下是我的代码:

import com.xxxxx.kafka.{KafkaJsonDeserializer, KafkaObjectDecoder, pharmacyData}
import kafka.serializer.StringDecoder
import org.apache.spark.streaming.kafka.KafkaUtils
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.streaming.{Seconds, StreamingContext}

object sparkReadKafka {
  val sparkConf = new SparkConf().setAppName("SparkReadKafka")
  val sc = new SparkContext(sparkConf)
  val ssc = new StreamingContext(sc, Seconds(1))

  def main(args: Array[String]): Unit = {
    val kafkaParams = Map[String, Object] (
      "bootstrap.servers" -> "kafka.kafka-cluster-shared.non-prod-5-az-scus.prod.us.xxxxx.net:9092",
      //"key.deserializer" -> classOf[StringDeserializer],
      //"value.deserializer" -> classOf[KafkaJsonDeserializer],
      "group.id" -> "consumer-group-2",
      "auto.offset.reset" -> "earliest",
      "auto.commit.interval.ms" -> "1000",
      "enable.auto.commit" -> (false: java.lang.Boolean),
      "session.timeout.ms" -> "30000"
    )

    val topic = "hw_insights"

    val stream = KafkaUtils.createDirectStream[String, pharmacyData, StringDecoder, KafkaObjectDecoder](ssc, kafkaParams, Set(topic))
  }
}
我得到的错误与此类似(出于安全目的,我必须删除某些部分):

错误:(29,47)重载了方法值createDirectStream,其中包含替代项: (jssc:org.apache.spark.streaming.api.java.JavaStreamingContext,keyClass:Class[String],valueClass:Class[com.xxxxxxx.kafka.pharmacyData],keyDecoderClass:Class[kafka.serializer.StringDecoder],valueDecoderClass:Class[com.xxxxxxx.kafka.KafkaObjectDecoder],Kafkarams:java.util.Map[String,String],主题:java.util.Set[String])org.apache.spark.streaming.api.java.JavaPairInputStream[String,com.xxxxxxx.kafka.pharmacyData] (ssc:org.apache.spark.streaming.StreamingContext,kafkaParams:scala.collection.immutable.Map[String,String],主题:scala.collection.immutable.Set[String])(隐式证据$19:scala.reflect.ClassTag[String],隐式证据$20:scala.reflect.ClassTag[com.xxxxxxx.kafka.pharmacyData],隐式证据$21:scala.reflect.ClassTag[kafka.serializer.StringDecoder],隐式证据$22:scala.reflect.ClassTag[com.xxxxxxx.kafka.KafkaObjectDecoder])org.apache.spark.stream.dstream.InputDStream[(String,com.xxxxxxx.kafka.pharmacyData)] 无法应用于(org.apache.spark.streaming.StreamingContext,scala.collection.immutable.Map[String,Object],scala.collection.immutable.Set[String]) val stream=KafkaUtils.createDirectStream[字符串,pharmacyData,StringDecoder,KafkaObjectDecoder](ssc,kafkaParams,集合(主题)) 下面是我的客户解码器类:


有人能帮我解决问题吗?谢谢!

错误是您的参数不正确

无法应用于
(org.apache.spark.streaming.StreamingContext,scala.collection.immutable.Map[String,Object],scala.collection.immutable.Set[String])

它认为你想要的是


(jssc:org.apache.spark.streaming.api.java.JavaStreamingContext,keyClass:Class[String],valueClass:Class[com.xxxxxxx.kafka.pharmacyData],keyDecoderClass:Class[kafka.serializer.StringDecoder],valueDecoderClass:Class[com.xxxxxxx.kafka.KafkaObjectDecoder],kafkaParams:java.util.Map[String,String],主题:java.util.Set[String])

1)请显示完整的错误。看起来像是编译问题2)Kafka已经带有json反序列化程序。3)但是你也应该升级SparkHi,我只是添加了完整的错误。你能告诉我如何添加Kafka json反序列化程序吗?如果你有示例会更好。升级spark不在我的控制之下。谢谢!为什么你没有r控制?你可以更新你的maven依赖项,并将你自己的Spark distribution tarball上载到包含较新版本的HDFS,你看到了吗?我需要将项目提交给Spark cluster。Spark cluster运行在Spark 1.6.2上。对不起,我不明白,我所做的哪一部分是不正确的。你能更具体一点吗?我真的是一个spark streaming和kafka新手。非常感谢!这是一个Scala问题,而不是kafka或streaming。您从何处复制此代码?您是否使用IDE编写它?错误告诉您问题存在于第29行是的,我使用的是IntelliJ iDea,createDirectStream方法上没有显示错误?不,错误在第29行,而ch正是我使用createDirectStream方法的行。因此,我认为错误是因为我没有正确使用此方法。
import kafka.serializer.Decoder
import org.codehaus.jackson.map.ObjectMapper

class KafkaObjectDecoder extends Decoder[pharmacyData] {
  override def fromBytes(bytes: Array[Byte]): pharmacyData = {
    val mapper = new ObjectMapper()
    val pdata = mapper.readValue(bytes, classOf[pharmacyData])
    pdata
  }
}