在Java中迭代Spark数据帧而不使用Collect
我正在使用Spark 1.6.1 我有一个数据框架,我需要迭代并将每一行写入Kafka。现在我正在做这样的事情:在Java中迭代Spark数据帧而不使用Collect,java,loops,apache-spark,dataframe,apache-kafka,Java,Loops,Apache Spark,Dataframe,Apache Kafka,我正在使用Spark 1.6.1 我有一个数据框架,我需要迭代并将每一行写入Kafka。现在我正在做这样的事情: Producer<String><String> message; for(Row x: my_df.collect()){ kafka_message = new Producer<String><String>(topic, String.valueOf(x)) my_kafka_producer.send(kafk
Producer<String><String> message;
for(Row x: my_df.collect()){
kafka_message = new Producer<String><String>(topic, String.valueOf(x))
my_kafka_producer.send(kafka_message);
}
生产者消息;
for(第x行:my_df.collect()){
kafka_message=新制作人(主题,String.valueOf(x))
我的卡夫卡制作人。发送(卡夫卡消息);
}
这里的问题是collect将数据发送给驱动程序,然后推送到kafka。考虑到我有大约250个执行者,我的1驱动程序无法有效地处理工作负载。因此,我想知道如何在执行器上迭代数据帧。这将需要避免执行collect()。我发现一篇文章大致解释了如何实现它,但不幸的是,他们与GitHub的链接实际上已经过期,所以我找不到如何实现它
供参考的条款:
在Java中,您可以尝试以下方法。扩展
AbstractFunction1
import scala.runtime.AbstractFunction1;
abstract class MyFunction1<T,R> extends AbstractFunction1<T, R> implements Serializable {
}
import scala.collection.Iterator;
import scala.runtime.BoxedUnit;
df.foreachPartition(new MyFunction1<Iterator<Row>,BoxedUnit>(){
@Override
public BoxedUnit apply(Iterator<Row> rows) {
while(rows.hasNext()){
//get the Row
Row row = rows.next();
}
return BoxedUnit.UNIT;
}
});