SparkSession.sql和Dataset.sqlContext.sql有什么区别?

时间:2017-12-07 09:06:56

标签: apache-spark apache-spark-sql

我有以下代码片段,我想知道这两者之间有什么区别,我应该使用哪一个?我正在使用spark 2.2。

Dataset<Row> df = sparkSession.readStream()
    .format("kafka")
    .load();

df.createOrReplaceTempView("table");
df.printSchema();

Dataset<Row> resultSet =  df.sqlContext().sql("select value from table"); //sparkSession.sql(this.query);
StreamingQuery streamingQuery = resultSet
        .writeStream()
        .trigger(Trigger.ProcessingTime(1000))
        .format("console")
        .start();

VS

Dataset<Row> df = sparkSession.readStream()
    .format("kafka")
    .load();

df.createOrReplaceTempView("table");

Dataset<Row> resultSet =  sparkSession.sql("select value from table"); //sparkSession.sql(this.query);
StreamingQuery streamingQuery = resultSet
        .writeStream()
        .trigger(Trigger.ProcessingTime(1000))
        .format("console")
        .start();

1 个答案:

答案 0 :(得分:8)

sparkSession.sql("sql query")df.sqlContext().sql("sql query")之间的微妙差异。

请注意,您可以在一个Spark应用程序中拥有零个,两个或更多个SparkSession(但它假设您至少拥有SparkSessionDataset Spark SQL 应用程序中。

另请注意,SparkSession绑定到SparkSession,但scala> spark.version res0: String = 2.3.0-SNAPSHOT scala> :type spark org.apache.spark.sql.SparkSession scala> spark.sql("show tables").show +--------+---------+-----------+ |database|tableName|isTemporary| +--------+---------+-----------+ +--------+---------+-----------+ scala> val df = spark.range(5) df: org.apache.spark.sql.Dataset[Long] = [id: bigint] scala> df.sqlContext.sql("show tables").show +--------+---------+-----------+ |database|tableName|isTemporary| +--------+---------+-----------+ +--------+---------+-----------+ scala> val anotherSession = spark.newSession anotherSession: org.apache.spark.sql.SparkSession = org.apache.spark.sql.SparkSession@195c5803 scala> anotherSession.range(10).createOrReplaceTempView("new_table") scala> anotherSession.sql("show tables").show +--------+---------+-----------+ |database|tableName|isTemporary| +--------+---------+-----------+ | |new_table| true| +--------+---------+-----------+ scala> df.sqlContext.sql("show tables").show +--------+---------+-----------+ |database|tableName|isTemporary| +--------+---------+-----------+ +--------+---------+-----------+ 永远不会更改。

您可能想知道为什么有人会想要它,但这会让您在查询之间找到边界,并且您可以为不同的数据集使用相同的表名,这实际上是Spark SQL的一个非常强大的功能。

以下示例显示了差异,希望能让您知道它为什么会变得强大。

{{1}}