SparkSQL-SQL查询和全局临时视图

一、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|
// +----+-------+