我可以将 %sql 块的输出保存为对象吗?

Can I save the output from a %sql block as an object?

我有一个 %sql 块,我在其中使用此代码创建的数据框。

df.createOrReplaceTempView("df")

我 运行 一些查询来操作 %sql 块中的数据,我想获取该输出并在块外对其进行操作。具体来说,我想将其放入 %r 块中并可视化数据。我可以让 %sql 块中的数据从块外访问吗?

您需要按如下方式编写 SQL 查询:

CREATE [OR REPLACE] [[GLOBAL] TEMPORARY] VIEW [db_name.]view_name
  [(col_name1 [COMMENT col_comment1], ...)]
  [COMMENT table_comment]
  [TBLPROPERTIES (key1=val1, key2=val2, ...)]
    AS select_statement

示例:

CREATE OR REPLACE TEMPORARY VIEW temp_v
  AS SELECT * FROM db_name.df WHERE foo = 'bar';

然后您就可以将其提取到您的代码中,如下所示:

val tmp = spark.sql("select * from temp_v limit 10")
tmp.show
// +---+---+
// | id|foo|
// +---+---+
// |500|bar|
// |501|bar|
// |502|bar|
// |503|bar|
// |504|bar|
// |505|bar|
// |506|bar|
// |507|bar|
// |508|bar|
// |509|bar|
// +---+---+

要跟进@eliasah 所说的内容,您还可以使用 spark.sql() 将所有 sql queries/manipulations 保留在 %spark zeppelin 段落中并跳过 %sql段一共。这将为您提供一个 DataFrame。

来自 spark.apache.org/docs - sql 编程指南:

The sql function on a SparkSession enables applications to run SQL queries programmatically and returns the result as a DataFrame.

// Register the DataFrame as a SQL temporary view
df.createOrReplaceTempView("people")

val sqlDF = spark.sql("SELECT * FROM people")
sqlDF.show()
// +----+-------+
// | age|   name|
// +----+-------+
// |null|Michael|
// |  30|   Andy|
// |  19| Justin|
// +----+-------+

您还可以使用三重引号做更长、更复杂的事情 SQL。示例:

val longerSqlDF = spark.sql("""
  WITH q1 AS (
    SELECT *
    FROM people
    WHERE age > 20 AND name like 'A%'
    ORDER BY age DESC
  )
  SELECT *
  , COUNT(*) OVER (PARTITION BY age) AS age_total
  FROM q1
""")