5

在 Spark SQL 中,当我尝试在 DataFrame 上使用 map 函数时,我遇到了以下错误。

DataFrame 类型中的方法 map(Function1, ClassTag) 不适用于参数(new Function(){})

我也在关注 spark 1.3 文档。https://spark.apache.org/docs/latest/sql-programming-guide.html#inferring-the-schema-using-reflection有任何一种解决方案吗?

这是我的测试代码。

   // SQL can be run over RDDs that have been registered as tables.
DataFrame teenagers = sqlContext.sql("SELECT name FROM people WHERE age >= 13 AND age <= 19");

List<String> teenagerNames = teenagers.map(
            new Function<Row, String>() {
          public String call(Row row) {
            return "Name: " + row.getString(0);
          }
        }).collect();
4

6 回答 6

12

将其更改为:

Java 6 和 7

List<String> teenagerNames = teenagers.javaRDD().map(
    new Function<Row, String>() {
    public String call(Row row) {
        return "Name: " + row.getString(0);
    }
}).collect();

爪哇 8

List<String> t2 = teenagers.javaRDD().map(
    row -> "Name: " + row.getString(0)
).collect();

一旦你调用 javaRDD() 它就像任何其他 RDD 映射函数一样工作。

这适用于 Spark 1.3.0 及更高版本。

于 2015-05-05T17:44:22.317 回答
2

无需转换为 RDD,它会延迟执行它可以如下完成

`public static void mapMethod() { // 从文件中读取数据,文件在类路径中。数据集 df = sparkSession.read().json("file1.json");

// Prior to java 1.8 
Encoder<String> encoder = Encoders.STRING();
    List<String> rowsList = df.map((new MapFunction<Row, String>() {
        private static final long serialVersionUID = 1L;

        @Override
        public String call(Row row) throws Exception {
            return "string:>" + row.getString(0).toString() + "<";
        }
    }), encoder).collectAsList();

// from java 1.8 onwards
List<String> rowsList1 = df.map((row -> "string >" + row.getString(0) + "<" ), encoder).collectAsList();
System.out.println(">>> " + rowsList);
System.out.println(">>> " + rowsList1);

}`

于 2017-12-23T03:55:38.420 回答
0

您是否在 pom.xml 中设置了正确的依赖项?设置并尝试

    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-sql_2.10</artifactId>
        <version>1.3.1</version>
    </dependency>
于 2015-04-22T13:38:55.563 回答
0

尝试这个:

// SQL can be run over RDDs that have been registered as tables.
DataFrame teenagers = sqlContext.sql("SELECT name FROM people WHERE age >= 13 AND age <= 19");

List<String> teenagerNames = teenagers.toJavaRDD().map(
        new Function<Row, String>() {
      public String call(Row row) {
        return "Name: " + row.getString(0);
      }
    }).collect();

您必须将 DataFrame 转换为 javaRDD

于 2015-06-04T10:01:12.707 回答
0

请检查您的输入文件的数据和您的数据框 sql 查询与我面临的相同的事情,当我回顾数据时,它与我的查询不匹配。所以可能你面临同样的问题。toJavaRDD 和 JavaRDD 都在工作。

于 2016-04-12T06:45:34.163 回答
0

检查您是否使用正确的导入

Row(import org.apache.spark.sql.Row) 删除与 Row 相关的任何其他导入。否则你的语法是正确的

于 2016-02-04T11:02:47.540 回答