如何使用Java在Spark DataFrame中应用映射函数



我正在尝试使用 Java 在 Spark 中的 DataFrame 上使用映射函数。我正在遵循文档,其中说

地图(斯卡拉。Function1 f, scala.reflect.ClassTag evidence$4) 通过将函数应用于此数据帧的所有行来返回新RDD

在map中使用Function1时,我需要实现所有函数。我看到了一些与此相关的问题,但是提供的解决方案将DataFrame转换为RDD。如何在DataFrame中使用map函数而不将其转换为RDD还有map的第二个参数是什么,即scala.reflect.ClassTag<R> evidence$4

我使用的是Java 7Spark 1.6

我知道

你的问题是关于Java 7和Spark 1.6的,但是在Spark 2(显然还有Java 8)中,你可以将map函数作为类的一部分,所以你不需要操作Java lambdas。

调用将如下所示:

Dataset<String> dfMap = df.map(
    new CountyFipsExtractorUsingMap(),
    Encoders.STRING());
dfMap.show(5);

该类将如下所示:

  /**
   * Returns a substring of the values in the id2 column.
   * 
   * @author jgp
   */
  private final class CountyFipsExtractorUsingMap
      implements MapFunction<Row, String> {
    private static final long serialVersionUID = 26547L;
    @Override
    public String call(Row r) throws Exception {
      String s = r.getAs("id2").toString().substring(2);
      return s;
    }
  }

您可以在 GitHub 上找到此示例中的更多详细信息。

我认为map不是在DataFrame上使用的正确方法。也许您应该看看 API 中的示例

在那里,他们展示了如何在DataFrame上进行操作

可以直接

使用数据集,不需要将读取的数据转换为RDD,其不必要的资源消耗。

dataset.map(mapfuncton{...}, encoder); 这应该足以满足您的需求。

因为你没有给出任何具体的问题,所以在DataFrame中有一些常见的map替代方案,如selectselectExprwithColumn。如果 spark sql 内置函数不适合您的任务,您可以使用 UTF。

相关内容

  • 没有找到相关文章

最新更新