【问题标题】:How does createOrReplaceTempView work in Spark?在 Spark 中 createOrReplaceTempView 是如何工作的?
【发布时间】:2017-10-16 03:33:42
【问题描述】:

我是 Spark 和 Spark SQL 的新手。

createOrReplaceTempView 在 Spark 中是如何工作的?

如果我们将对象的RDD 注册为表,Spark 会将所有数据保留在内存中吗?

【问题讨论】:

    标签: apache-spark apache-spark-sql spark-dataframe


    【解决方案1】:

    createOrReplaceTempView 创建(或如果该视图名称已经存在则替换)一个惰性求值的“视图”,然后您可以像 Spark SQL 中的配置单元表一样使用它。除非您缓存支撑视图的数据集,否则它不会持久存在内存中。

    scala> val s = Seq(1,2,3).toDF("num")
    s: org.apache.spark.sql.DataFrame = [num: int]
    
    scala> s.createOrReplaceTempView("nums")
    
    scala> spark.table("nums")
    res22: org.apache.spark.sql.DataFrame = [num: int]
    
    scala> spark.table("nums").cache
    res23: org.apache.spark.sql.Dataset[org.apache.spark.sql.Row] = [num: int]
    
    scala> spark.table("nums").count
    res24: Long = 3
    

    数据仅在.count 调用后才被完全缓存。这是它已被缓存的证据:

    相关SO:spark createOrReplaceTempView vs createGlobalTempView

    相关引用(与持久表相比):“与 createOrReplaceTempView 命令不同,saveAsTable 将具体化 DataFrame 的内容并创建指向 Hive 元存储中数据的指针。”来自https://spark.apache.org/docs/latest/sql-programming-guide.html#saving-to-persistent-tables

    注意:createOrReplaceTempView 以前是 registerTempTable

    【讨论】:

    • 这个view 会创建一个临时表吗?而且,view 在 Spark 中是否有任何特定名称,例如 hive 表?
    • 是的,它实际上是一个表格,除了它必须被评估,因为它没有具体化到文件中。您可以像使用配置单元表一样使用视图(例如在原始 SQL 查询中)
    • 与传统的临时表不同,临时视图根本不会物化到内存中。它对于访问 SQL 中的数据很有用,但要了解它的语句必须在每次访问时都进行评估
    • @GarrenS 如何缓存 val df = sparkSession.sqlContext.sql("SELECT * FROM table) df.createOrReplaceTempView("trans_union") 找不到如何缓存它?
    • @MichaelChirico in Python 是的,括号是必需的。在 Scala 中,它们是可选的。还是您指的是这些电话的另一个方面?
    【解决方案2】:

    CreateOrReplaceTempView 将在内存上创建表的临时视图,此时它不是持久的,但您可以在此之上运行 SQL 查询。如果你想保存它,你可以坚持或使用saveAsTable 保存。

    首先,我们读取 .csv 格式的数据,然后转换为数据框并创建一个临时视图

    读取 .csv 格式的数据

    val data = spark.read.format("csv").option("header","true").option("inferSchema","true").load("FileStore/tables/pzufk5ib1500654887654/campaign.csv")
    

    打印架构

    data.printSchema
    

    data.createOrReplaceTempView("Data")
    

    现在我们可以在刚刚创建的表视图之上运行 SQL 查询

      %sql SELECT Week AS Date, Campaign Type, Engagements, Country FROM Data ORDER BY Date ASC
    

    【讨论】:

      【解决方案3】:

      SparkSQl 支持使用 Dataset 和 Dataframe API 编写程序,同时需要支持 sql。

      为了在 DataFrames 上支持 Sql,首先它需要一个包含列名的表定义,如果它创建表,hive 元存储将获得很多不必要的表,因为 Spark-Sql 原生驻留在 hive 上。因此它将创建一个临时视图,该视图暂时在 hive 中可用并用作任何其他 hive 表,一旦 Spark Context 停止,它将被删除。

      为了创建视图,开发人员需要一个名为 createOrReplaceTempView

      的实用程序

      【讨论】:

        猜你喜欢
        • 2017-04-02
        • 2017-09-24
        • 1970-01-01
        • 1970-01-01
        • 2017-08-24
        • 2015-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多