Spark - Java - foreachPartition

时间:2017-03-21 06:46:02

标签: java apache-spark

我的环境如下 Spark 1.6.1 Hadoop 2.6.2

我们的要求如下(全部在 Java Spark中)     1.读取CSV文件并应用架构并将其转换为数据框     2.通过Spark分区SQL获取所有不同的分区数据并并行迭代

当我尝试第二步时,我遇到了错误。

    DataFrame  sourceRowDF = hiveContext.createDataFrame(srcRowsRDD,source_Schema);
    sourceRowDF.registerTempTable("sourcetable");
    DataFrame  partitionedData = hiveContext.sql("select * from sourcetable distribute by region");

    partitionedData.foreachPartition( new ForeachPartitionFunc() {
    @Override
    public void call(Iterator<Row> it) {
        while (it.hasNext()) {
            System.out.println(it.next().toString());
        }
    }
});

抽象函数如下

public abstract class ForeachPartitionFunc extends AbstractFunction1<Iterator<Row>, BoxedUnit> implements Serializable {
        @Override
    public BoxedUnit apply(Iterator<Row> it) {
        call(it);
        return BoxedUnit.UNIT;
    }
    public abstract void call( Iterator<Row> it);
}

当我尝试编译此代码时,它会给我以下错误

Error:(254, 39) java: non-static variable this cannot be referenced from a static context

请问我做错了什么。

由于

巴拉

1 个答案:

答案 0 :(得分:1)

我必须在抽象实现中有一个公共静态类。我改变了核心抽象实现如下

public  static class ForeachPartitionFunc extends AbstractFunction1<Iterator<Row>, BoxedUnit> implements Serializable {
        @Override
    public BoxedUnit apply(Iterator<Row> it) {
        call(it);
        return BoxedUnit.UNIT;
    }

    public void call(Iterator<Row> r) {
      System.out.println("this is to test");
    }
}