Apache spark spark外部数据库中的微批次查找

Apache spark spark外部数据库中的微批次查找,apache-spark,spark-streaming,Apache Spark,Spark Streaming,我需要使用Spark处理日志行。处理过程中的一个步骤是在外部数据库中查找特定值 对于ex: 我的日志行包含多个键值对。日志中存在的一个密钥是“key1”。此键需要用于查找调用。 我不想在外部数据库中为RDD中的每个“key1”值顺序进行多个查找调用,而是要创建RDD中存在的所有“key1”值的列表,然后在外部数据库中进行单个查找调用 我从每个日志行提取密钥的代码如下所示: lines.foreachRDD{rdd => rdd.map(line => extractKey(line)

我需要使用Spark处理日志行。处理过程中的一个步骤是在外部数据库中查找特定值

对于ex: 我的日志行包含多个键值对。日志中存在的一个密钥是“key1”。此键需要用于查找调用。 我不想在外部数据库中为RDD中的每个“key1”值顺序进行多个查找调用,而是要创建RDD中存在的所有“key1”值的列表,然后在外部数据库中进行单个查找调用

我从每个日志行提取密钥的代码如下所示:

lines.foreachRDD{rdd => rdd.map(line => extractKey(line))
// next step is lookup
// then further processing
每个日志行都会调用.map函数,因此我不确定如何创建可用于外部查找的键列表


谢谢

看起来你想要这个:

lines.groupByKey().filter()

你能提供更多信息吗?

使用
collect

lines.foreachRDD{rdd => 
    val keys = rdd.map(line => extractKey(line)).collect()
    // here you can use keys List
可能您还必须使用mapPartitions:

lines.foreachRDD{rdd => 
    rdd.foreachPartition(iter => {
        val keys = iter.map(line => extractKey(line)).toArray
        // here you can use keys Array

    }
}

每1个分区将有1个调用,此方法避免了序列化问题

您可以在映射后使用
collect
collectAsList
方法,它将作为数组[Key]或列表[Key]返回。我要使用的“key1”只是日志行中的一列。这是一个仅用于查找的键。例如,我得到了键为“key1”的2个日志行,我将使用该键查找数据库中的某个值。我得到的结果将附加到日志行,并继续进一步处理。所以基本上,我是在尝试积累执行者而不是驱动者的钥匙列表。谢谢。。有没有办法,我可以每个rdd调用一个,而不是每个分区调用一个?