DataSet 上的映射在计数操作时执行两次,即使 DataSet 具有模式
Map on DataSet executing twice while count operation even DataSet has schema
DsDetails 包含一条记录,但内部逻辑(API) in map 调用两次,因为执行 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;
}
}
当我们在 RDD 上调用 action(Count) 时,每次 map 都会重新计算 "from scratch" 这就是它迭代多次的原因。
所以在Map完成后可以缓存这个结果,然后对其进行操作,避免多次调用Map。
所以地图代码之后看起来像,
detailsDf.cache();
System.out.println(detailsDf.count());
DsDetails 包含一条记录,但内部逻辑(API) in map 调用两次,因为执行 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;
}
}
当我们在 RDD 上调用 action(Count) 时,每次 map 都会重新计算 "from scratch" 这就是它迭代多次的原因。
所以在Map完成后可以缓存这个结果,然后对其进行操作,避免多次调用Map。
所以地图代码之后看起来像,
detailsDf.cache();
System.out.println(detailsDf.count());