我有一个要求,我需要使用Spark处理日志行。处理中的一个步骤是在外部数据库中查找某个值。
对于前者: 我的日志行包含多个键值对。日志中存在的一个关键是" key1"。此密钥需要用于查找调用。 我不希望在外部数据库中按顺序为" key1"的每个值进行多次查找调用。在RDD .Rather我想创建一个包含" key1"的所有值的列表。出现在RDD中,然后在外部DB中进行单个查找调用。
我从每个日志行中提取密钥的代码如下所示:
lines.foreachRDD{rdd => rdd.map(line => extractKey(line))
// next step is lookup
// then further processing
将为每个日志行调用.map函数,所以我不确定,如何创建可用于外部查找的键列表。
由于
答案 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()
你能提供更多信息吗?