我正在尝试使用 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 7和Spark 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
替代方案,如select
、selectExpr
、withColumn
。如果 spark sql 内置函数不适合您的任务,您可以使用 UTF。