【问题标题】:Can I save the output from a %sql block as an object?我可以将 %sql 块的输出保存为对象吗?
【发布时间】:2020-01-03 09:33:27
【问题描述】:
我有一个 %sql 块,在我使用此代码创建的数据框上。
df.createOrReplaceTempView("df")
我运行了许多查询来操作 %sql 块中的数据,我想获取该输出并在块外对其进行操作。具体来说,我想将其放入%r 块中并可视化数据。我可以从块外部访问%sql 块中的数据吗?
【问题讨论】:
标签:
scala
apache-spark
apache-zeppelin
【解决方案1】:
您需要按如下方式编写 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|
// +---+---+
【解决方案2】:
要跟进@eliasah 所说的内容,您还可以使用spark.sql() 将所有sql 查询/操作保留在%spark zeppelin 段落中,并完全跳过%sql 段落。结果,这将为您提供一个 DataFrame。
来自 spark.apache.org/docs - sql 编程指南:
SparkSession 上的 sql 函数使应用程序能够以编程方式运行 SQL 查询并将结果作为 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
""")