我是Scala和Spark的新手,我遇到了这个简单的问题,我不知道如何解决。
即,我有2个RDD,我们将它们命名为tx_inputs
和input_tx
。
他们有以下声明:
tx_inputs
是2元组的RDD,格式为(tx_1, [input1, input2, ...])
,其中[]
括号表示Set。密钥(tx_1, tx_2.., tx_n
)是唯一的。但相关列表中的tx_k
可以包含来自input
的一个或多个tx_j
(其中j!= k)
input_tx
是2元组的RDD,格式为(input_n, false)
。这里的键是输入,它们是唯一的。
我想要做的是实现以下伪代码,即产生相同的结果:
do{
changeHappened=false
for (tx, inputs) from tx_inputs:
if (inputs.length == 1):
input_tx(inputs[0]) = tx
tx_inputs.remove(tx)
changeHappened = true
removeAllLabeledInputs(tx_inputs, input_tx)
} while(changeHappened)
removeAllLabeledInputs
应从input
中tx_inputs
中未标记为false
的所有集合(值)中删除每个input_tx
的位置。
所有值均为String
。我正在使用Scala 2.11和Spark 2.2.1
P.S。如果我不够清楚,这里有一个小例子:
一开始,我们遇到以下情况:
tx_inputs:
(tx_1, [input1, input2]),
(tx_2, [input1]),
(tx_3, [input3, input4, input1])
inputx_tx:
(input1, false),
(input2, false),
(input3, false),
(input4, false)
在算法的最后我们有:
tx_inputs:
(tx_3, [input3, input4])
inputx_tx:
(input1, tx_2),
(input2, tx_1),
(input3, false),
(input4, false)