【问题标题】: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
    """)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-21
      • 2010-11-20
      • 2023-01-25
      • 2015-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多