我有一个有关如何更新JavaRDD值的问题。
我有一个JavaRDD<CostedEventMessage>
,其中的消息对象包含有关应将其写入kafka主题分区的信息。
我正在尝试使用以下代码更改此类对象的partitionId
字段:
rddToKafka = rddToKafka.map(event -> repartitionEvent(event, numPartitions));
repartitionEvent
逻辑为:
costedEventMessage.setPartitionId(1);
return costedEventMessage;
但是修改不会发生。
能否请您说明为什么以及如何正确修改JavaRDD中的值?
答案 0 :(得分:0)
Spark是惰性的,因此从上面粘贴的代码尚不清楚您是否实际上对JavaRDD执行了任何操作(例如collect
或forEach
),以及如何得出结论认为数据是没有改变。
例如,如果您通过运行以下代码来假定这样做:
List<CostedEventMessage> messagesLst = ...;
JavaRDD<CostedEventMessage> rddToKafka = javaSparkContext.parallelize(messagesLst);
rddToKafka = rddToKafka.map(event -> repartitionEvent(event, numPartitions));
messagesLst
中的每个元素都将分区设置为1,这是错误的。
如果您添加了以下示例,那将成立:
messagesLst = rddToKafka.collect();
有关更多详细信息,请参见documentation