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());