【问题标题】:Value split is not a member of (String, String)值拆分不是 (String, String) 的成员
【发布时间】:2017-11-15 00:56:31
【问题描述】:

我正在尝试从 Kafka 读取数据并通过 Spark RDD 将数据存储到 Cassandra 表中。

编译代码时出错:

/root/cassandra-count/src/main/scala/KafkaSparkCassandra.scala:69: value split is not a member of (String, String)

[error]     val lines = messages.flatMap(line => line.split(',')).map(s => (s(0).toString, s(1).toDouble,s(2).toDouble,s(3).toDouble))
[error]                                               ^
[error] one error found

[error] (compile:compileIncremental) Compilation failed

下面的代码:当我通过交互式spark-shell 手动运行代码时,它工作正常,但是在为spark-submit 编译代码时出现错误。

// Create direct kafka stream with brokers and topics
val topicsSet = Set[String] (kafka_topic)
val kafkaParams = Map[String, String]("metadata.broker.list" -> kafka_broker)
val messages = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder]( ssc, kafkaParams, topicsSet)

// Create the processing logic
// Get the lines, split
val lines = messages.map(line => line.split(',')).map(s => (s(0).toString, s(1).toDouble,s(2).toDouble,s(3).toDouble))
lines.saveToCassandra("stream_poc", "US_city", SomeColumns("city_name", "jan_temp", "lat", "long")) 

【问题讨论】:

  • @RameshMaharjan:请不要将专有名词格式化为代码。 Kafka 和 Cassandra 只需要初始资金,仅此而已——它们本身并不是代码。但是,spark-shell 之类的内容是可以的,因为代码格式适用于控制台 I/O(假设 spark-shell 是键入的命令)。

标签: scala apache-spark apache-kafka spark-streaming spark-submit


【解决方案1】:

kafka 中的所有消息都是键控的。原始的 Kafka 流,在本例中为 messages,是一个元组流 (key,value)

正如编译错误指出的那样,元组上没有 split 方法。

我们在这里要做的是:

messages.map{ case (key, value)  => value.split(','))} ...

【讨论】:

    【解决方案2】:

    KafkaUtils.createDirectStream 返回一个 tuple 键和值(因为 Kafka 中的消息是可选的键控)。在您的情况下,它的类型为(String, String)。如果你想拆分value,你得先把它取出来:

    val lines = 
      messages
       .map(line => line._2.split(','))
       .map(s => (s(0).toString, s(1).toDouble,s(2).toDouble,s(3).toDouble))
    

    或者使用偏函数语法:

    val lines = 
      messages
       .map { case (_, value) => value.split(',') }
       .map(s => (s(0).toString, s(1).toDouble,s(2).toDouble,s(3).toDouble))  
    

    【讨论】:

      猜你喜欢
      • 2017-08-22
      • 1970-01-01
      • 2018-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多