一、SQL查询
SparkSession 的 sql 函数可以让应用程序以编程的方式运行 SQL 查询,并将结果作为一个 Dataset<Row> 返回。
// init_session
SparkSession spark = SparkSession
.builder()
.appName("Java Spark SQL basic example")
.config("spark.some.config.option", "some-value")
.getOrCreate();
// create_df
Dataset<Row> df = spark.read().json("examples/src/main/resources/people.json");
// Register the DataFrame as a SQL temporary view
df.createOrReplaceTempView("people");
Dataset<Row> sqlDF = spark.sql("SELECT * FROM people");
sqlDF.show();
// +----+-------+
// | age| name|
// +----+-------+
// |null|Michael|
// | 30| Andy|
// | 19| Justin|
// +----+-------+二、全局临时视图
Spark SQL中的临时视图是session级别的,也就是会随着session的消失而消失。如果我们想让一个临时视图在所有session中相互传递并且可用,直到Spark 应用退出,我们可以建立一个全局的临时视图。全局的临时视图存在于系统数据库 global_temp中,我们必须加上库名去引用它, 比如:SELECT * FROM global_temp.view1。
// Register the DataFrame as a global temporary view
df.createGlobalTempView("people");
// Global temporary view is tied to a system preserved database `global_temp`
spark.sql("SELECT * FROM global_temp.people").show();
// +----+-------+
// | age| name|
// +----+-------+
// |null|Michael|
// | 30| Andy|
// | 19| Justin|
// +----+-------+
// Global temporary view is cross-session
spark.newSession().sql("SELECT * FROM global_temp.people").show();
// +----+-------+
// | age| name|
// +----+-------+
// |null|Michael|
// | 30| Andy|
// | 19| Justin|
// +----+-------+