在计数操作时执行两次DataSet映射,即使DataSet具有模式

时间:2017-01-22 12:47:03

标签: apache-spark dataframe dataset spark-dataframe

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

detailsS​​chema.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;
    }
}

1 个答案:

答案 0 :(得分:1)

当我们在RDD上调用action(Count)时,每个时间映射将从头开始重新计算&#34;&#34;这就是它多次迭代的原因。

完成Map之后你可以缓存这个结果然后对它执行操作以避免在Map上多次调用。

所以在Map Code看起来之后,

TIMESTAMP [ WITHOUT TIME ZONE ]