使用Java在Apache Spark中根据由空格分隔的数据字符串创建键值对(按键减少)

时间:2018-11-03 02:52:26

标签: apache-spark

我只是从Apache Spark开始。我有一个数据集,如下所示:

const knex = await bp.db.get();
const userIds = await knex('_students').distinct('id').pluck('id');

const promises = userIds.map((userId) => {
  return bp.dialogEngine.jumpTo(userId, 'question.flow.json')
});

return Promise.all(promises);

我希望RDD如下所示: (A1,[Z1,Z2,Z3,Z4])其中A1是键,[Z1,Z2,Z3,Z4]是可迭代的字符串值。 我可以将键和冒号上的值分开,但是我不知道如何进一步进行。这是我的代码的一部分。

A1: Z1 Z2 Z3 Z4
A2: X1 X2 X3 X4 X5 X6
A3: L1 L2
A4: Z1 X4 L2

线看起来像A1:Z1 Z2 Z3 Z4

parts [0]有我的键,而parts [1]具有由空格分隔的键的所有值:Z1 Z2 Z3 Z4

1 个答案:

答案 0 :(得分:0)

我在上面的评论中提到的“爆炸”是flatMap,它从单个输入行中产生多个输出行。 您可以使用以下片段(可以单独由flatMapToPair实现,而无需涉及mapToPair,但是我分两步进行了操作,以使您清楚实际的情况):

JavaPairRDD<String, Iterable<String>> links = 

lines.flatMap(s -> {

List<String> pairs = new ArrayList<String>();
String[] parts = COLONS.split(s);
String[] outGoingLinks = SPACES.split(parts[1]);
for(int i=0; i < outGoingLinks.length; i++) 
        pairs.add(parts[0] + " " + outGoingLinks[i]);
return pairs.iterator();

}).mapToPair(s -> {

String[] parts = SPACES.split(s);
return new Tuple2<String, String>(parts[0], parts[1]);

}).distinct().groupByKey().cache();