在Spark SQL中,当我尝试在数据帧上使用map函数时,我得到以下错误。
数据类型 DataFrame 中的方法映射(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();
将其更改为:
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 及更高版本。
无需转换为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);
}'
你的pom中是否设置了正确的依赖项。设置并尝试
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.10</artifactId>
<version>1.3.1</version>
</dependency>
试试这个:
// 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
检查您是否使用了正确的导入
Row(import org.apache.spark.sql.Row) 删除与 Row 相关的任何其他导入。否则语法正确
输入文件的数据和数据帧sql查询 我面临的同样的事情,当我回头看数据时,它与我的查询不匹配。所以可能与您面临的问题相同。 toJavaRDD和JavaRDD都在工作。