从spark中查找外部数据库中的微码

时间:2016-11-30 23:24:32

标签: apache-spark spark-streaming

我有一个要求,我需要使用Spark处理日志行。处理中的一个步骤是在外部数据库中查找某个值。

对于前者: 我的日志行包含多个键值对。日志中存在的一个关键是" key1"。此密钥需要用于查找调用。 我不希望在外部数据库中按顺序为" key1"的每个值进行多次查找调用。在RDD .Rather我想创建一个包含" key1"的所有值的列表。出现在RDD中,然后在外部DB中进行单个查找调用。

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

lines.foreachRDD{rdd => rdd.map(line => extractKey(line))
// next step is lookup
// then further processing

将为每个日志行调用.map函数,所以我不确定,如何创建可用于外部查找的键列表。

由于

2 个答案:

答案 0 :(得分:2)

使用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个呼叫,此方法可避免序列化问题

答案 1 :(得分:0)

看起来你想要这个:

lines.groupByKey().filter()

你能提供更多信息吗?