foreach函数在Spark DataFrame中不起作用

时间:2017-01-06 09:44:46

标签: java hadoop apache-spark dataframe spark-dataframe

根据DataFrames API,定义为:

public void foreach(scala.Function1<Row,scala.runtime.BoxedUnit> f)

将函数f应用于所有行。

但是当我尝试时

Dataframe df = sql.read()
    .format("com.databricks.spark.csv")
    .option("header","true")
    .load("file:///home/hadoop/Desktop/examples.csv");

df.foreach(x->
{
   System.out.println(x);
});

我收到编译时错误。有什么错吗?

3 个答案:

答案 0 :(得分:4)

首先扩展scala.runtime.AbstractFunction1并实现Serializable,如下所示

public abstract class SerializableFunction1<T,R> 
      extends AbstractFunction1<T, R> implements Serializable 
{
}

现在使用下面这个SerializableFunction1类。

df.foreach(new SerializableFunction1<Row,BoxedUnit>(){
        @Override
        public BoxedUnit apply(Row row) {
            System.out.println(row.get(0));
            return BoxedUnit.UNIT;
        }
});

答案 1 :(得分:4)

您可以将其转换为Java RDD,以便将lambda用作:

df.toJavaRDD().foreach(x->
   System.out.println(x)
);

答案 2 :(得分:0)

尝试使用此代码:

df.foreach(new VoidFunction<String>(){ public void call(String line) {
          //your function code here
}});

如果您只是想显示df内容,那么这就容易多了:

df.show();