我可以将 %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
""")
我有一个 %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
""")