下面的依赖项在pom中:
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.10</artifactId>
<version>1.3.0</version>
</dependency>
我希望jar包含以下类:
org.apache.spark.sql.api.java.JavaSQLContext
但是当它包含包org.apache.spark.sql.api.java
时,所有包看起来都包含名为UDF1
- UDSF22
的接口。
获得JavaSQLContext
的正确依赖关系是什么?
谢谢。
JavaSQLContext
类已从1.3.0版本起删除。您应该使用org.apache.spark.sql.SQLContext
类代替。文档说明如下:
在Spark 1.3之前,有独立的Java兼容类(
JavaSQLContext
和JavaSchemaRDD
)来镜像Scala API。在Spark 1.3中,Java API和Scala API是统一的。使用这两种语言的用户都应该使用SQLContext
和DataFrame
。一般来说,这些类尝试使用两种语言都可用的类型(即Array
,而不是特定于语言的集合)。在某些情况下,如果不存在通用类型(例如,用于传递闭包或Maps
),则使用函数重载。此外,Java特定类型API已被删除。Scala和Java的用户都应该使用
org.apache.spark.sql.types
中提供的类以编程方式描述模式。
作为题外话,如果您想搜索哪些jar包含特定的类,您可以使用Maven Central的高级搜索并"按类名"搜索。下面是对JavaSQLContext的搜索:http://search.maven.org/ga搜索| 3 | 1 | fc % % 22 org.apache.spark.sql.api.java.javasqlcontext % 22
粗略地搜索一下,似乎类org.apache.spark.sql.api.java.JavaSQLContext
只出现在1.2
版本和更早版本的spark-sql
JAR文件中。您正在使用的代码很可能也在使用这个旧的依赖项。此时您有两个选择:您可以升级您的代码使用,或者您可以降级spark-sql
JAR。你可能会选择前一个选项。
如果您坚持保持代码不变,那么在POM中包含以下依赖项应该可以解决问题:
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.10</artifactId>
<version>1.2.2</version>
</dependency>
如果您想升级代码,请参阅@DB5
我也遇到了同样的问题,这是因为我看错了文档的版本。
我从最新的文档- https://spark.apache.org/docs/latest/sql-programming-guide.html#loading-data-programmatically -的理解是使用这样的东西(从文档复制):
SQLContext sqlContext = null; // Determine;
DataFrame schemaPeople = null; // The DataFrame from the previous example.
// DataFrames can be saved as Parquet files, maintaining the schema information.
schemaPeople.write().parquet("people.parquet");
// Read in the Parquet file created above. Parquet files are self-describing so the schema is preserved.
// The result of loading a parquet file is also a DataFrame.
DataFrame parquetFile = sqlContext.read().parquet("people.parquet");
// Parquet files can also be registered as tables and then used in SQL statements.
parquetFile.registerTempTable("parquetFile");
DataFrame teenagers = sqlContext.sql("SELECT name FROM parquetFile WHERE age >= 13 AND age <= 19");
List<String> teenagerNames = teenagers.javaRDD().map(new Function<Row, String>() {
public String call(Row row) {
return "Name: " + row.getString(0);
}
}).collect();