DsDetails包含一条记录,但在地图中调用内部逻辑(API)两次,因为执行count()操作
有没有办法可以控制此地图的迭代或如何防止这种多次迭代?
实现更好的性能是一个主要问题。
下面的代码是用Java编写的,
用驱动程序编写的代码,
batchNumerDetails.foreachRDD(xJavaRdd -> {
Encoder<detailSchema> detailEncoder = Encoders.bean(detailSchema.class);
Dataset<Row> batchDF = SparkUtil.ConvertToDataSet(sparkSession, xJavaRdd);
//Input 1 row
Dataset<detailSchema> detailsDf = DsDetails.map(new MapFunction<Row, String>() {
@Override
public detailSchema call(Row row) {
// Unfortunately calling this method 2 times
detailSchema objdetailSchema = new detailSchema();
detailSchema.Id = "2";
detailSchema.Name = GetNameAPICall(row.<String>getAs("details"));
return objdetailSchema;
}
}, detailEncoder);
// Because of count, It map is executing twice
System.out.println(detailsDf.count());
// output 1 row
});
detailsSchema.java
Public class detailSchema
{
public String Id;
public String Name;
public String getId() {
return Id;
}
public void setId(String Id) {
this.Id = Id;
}
public String getName() {
return Name;
}
public void setName(String Name) {
this.Name = Name;
}
}
答案 0 :(得分:1)
当我们在RDD上调用action(Count)时,每个时间映射将从头开始重新计算&#34;&#34;这就是它多次迭代的原因。
完成Map之后你可以缓存这个结果然后对它执行操作以避免在Map上多次调用。
所以在Map Code看起来之后,
TIMESTAMP [ WITHOUT TIME ZONE ]