【问题标题】:foreach function not working in Spark DataFrameforeach 函数在 Spark DataFrame 中不起作用
【发布时间】:2017-05-21 01:12:57
【问题描述】:

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

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

【问题讨论】:

  • 我投了反对票,因为您需要将错误消息添加到问题中。
  • 出于多种原因,我对这个问题投了反对票。首先,错误消息不可用,因此它属于我的代码无法正常工作的类别。其次,用于foreach 打印输出。三是因为有错别字。 DataFrame 是一个大 F !我也投票结束这个问题。
  • 我赞成这个问题,因为我最终遇到了同样的问题。编译有两个问题: 1. 参数Function1&lt;Row, BoxedUnit&gt; 好像不适合Java lambdas 2. 如果参数是df.foreach(new AbstractFunction1&lt;Row, BoxedUnit&gt;() { @Override public BoxedUnit apply(Row arg0) { return null; } });, 就可以了。
  • 第二个错误是DataFrame类型中的foreach(Function1)方法不适用于参数((Row x) -> {}) (或 ((Row x, BoxedUnit b) -> {}))

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


【解决方案1】:

您可以将其转换为 Java RDD,以便像您一样使用 lambda:

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

【讨论】:

    【解决方案2】:

    首先扩展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;
            }
    });
    

    【讨论】:

    • 能否请您详细说明“BoxedUnit.UNIT”。这是什么意思?
    • Unit 相当于 Java 中的 scala 到 void 。 BoxedUnit 是一种与 JVM 相关的内部类型,通常不应在 API 中提供,但正如其他人所说,“有时它会泄漏到接口中”。
    【解决方案3】:

    试试这个代码:

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

    如果你只想显示 df 内容,这更容易:

    df.show();
    

    【讨论】:

    • @user6325753 你能把错误信息添加到你的问题吗?
    • 新的 VoidFunction 应该是新的 ForeachFunction。
    猜你喜欢
    • 2015-06-29
    • 1970-01-01
    • 2018-12-22
    • 2021-03-02
    • 2013-01-27
    • 2020-06-14
    • 1970-01-01
    • 2023-02-03
    • 1970-01-01
    相关资源
    最近更新 更多