Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
spark scala中的rdd.contains函数是否昂贵_Scala_Apache Kafka_Spark Streaming_Contains - Fatal编程技术网

spark scala中的rdd.contains函数是否昂贵

spark scala中的rdd.contains函数是否昂贵,scala,apache-kafka,spark-streaming,contains,Scala,Apache Kafka,Spark Streaming,Contains,在spark streaming中,我收到了来自卡夫卡流的数百万条消息。有15种不同类型的消息。消息来自一个主题。我只能通过内容来区分消息。所以我使用rdd.contains方法来获得不同类型的rdd 示例消息 {“a”:“foo”,“b”:“bar”,“type”:“first”…} {“a”:“foo1”,“b”:“bar1”,“type”:“second”…} {“a”:“foo2”,“b”:“bar2”,“type”:“third”…} {“a”:“foo”,“b”:“bar”,“typ

在spark streaming中,我收到了来自卡夫卡流的数百万条消息。有15种不同类型的消息。消息来自一个主题。我只能通过内容来区分消息。所以我使用rdd.contains方法来获得不同类型的rdd

示例消息

{“a”:“foo”,“b”:“bar”,“type”:“first”…}
{“a”:“foo1”,“b”:“bar1”,“type”:“second”…}
{“a”:“foo2”,“b”:“bar2”,“type”:“third”…}
{“a”:“foo”,“b”:“bar”,“type”:“first”…}
………

……
依此类推

代码


有没有办法从卡夫卡主题消息中获取不同的rdd?

没有
rdd.contains
。此处使用的函数
contains
应用于
RDD
中的
字符串

就像这里:

val rdd_first = rdd.filter {
  element => element.contains("First") // each `element` is a String 
}
此方法不可靠,因为字符串中的其他内容可能会满足比较要求,从而导致错误

e、 g

解决这个问题的一种方法是首先将JSON数据转换成适当的记录,然后对这些记录应用分组或过滤逻辑。为此,我们首先需要数据的模式定义。通过该模式,我们可以将记录解析为json,并在此基础上应用任何处理:

case class Record(a:String, b:String, `type`:String)

import org.apache.spark.sql.types._
val schema = StructType(
               Array(
                StructField("a", StringType, true),
                StructField("b", StringType, true),
                StructField("type", String, true)
               )
             )

val processPerType: Map[String, Dataset[Record] => Unit ] = Map(...) 

stream.foreachRDD { rdd =>
  val records = rdd.toDF("value").select(from_json($"value", schema)).as[Record]
  processPerType.foreach{case (tpe, process) =>
      val target = records.filter(entry => entry.`type` == tpe)
      process(target)
  }
} 
问题并没有具体说明需要对每种类型的记录应用何种逻辑。这里介绍的是一种处理问题的通用方法,其中任何自定义逻辑都可以表示为函数
Dataset[Record]=>Unit


如果逻辑可以表示为聚合,那么
数据集
聚合函数可能更合适。

我必须将数据存储在配置单元中。在配置单元中创建了15个不同的表。更新问题。实际上,一种JSON类型中有50多列。所以我必须创建15个案例类。是否有其他方法代替创建案例类???@KishoreKumarSuthar在使用初始的
案例类
(按照Spark行话)对数据进行“结构化”后,您可以对数据进行投影以匹配特定的表
(val tableProjection1=记录选择($“column”、$“column”、…),其中($“type”===…)
{"a":"foo", "b":"bar","type":"second", "c": "first", .......}
case class Record(a:String, b:String, `type`:String)

import org.apache.spark.sql.types._
val schema = StructType(
               Array(
                StructField("a", StringType, true),
                StructField("b", StringType, true),
                StructField("type", String, true)
               )
             )

val processPerType: Map[String, Dataset[Record] => Unit ] = Map(...) 

stream.foreachRDD { rdd =>
  val records = rdd.toDF("value").select(from_json($"value", schema)).as[Record]
  processPerType.foreach{case (tpe, process) =>
      val target = records.filter(entry => entry.`type` == tpe)
      process(target)
  }
}