【发布时间】:2017-10-16 03:33:42
【问题描述】:
我是 Spark 和 Spark SQL 的新手。
createOrReplaceTempView 在 Spark 中是如何工作的?
如果我们将对象的RDD 注册为表,Spark 会将所有数据保留在内存中吗?
【问题讨论】:
标签: apache-spark apache-spark-sql spark-dataframe
我是 Spark 和 Spark SQL 的新手。
createOrReplaceTempView 在 Spark 中是如何工作的?
如果我们将对象的RDD 注册为表,Spark 会将所有数据保留在内存中吗?
【问题讨论】:
标签: apache-spark apache-spark-sql spark-dataframe
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 表?
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
【讨论】:
SparkSQl 支持使用 Dataset 和 Dataframe API 编写程序,同时需要支持 sql。
为了在 DataFrames 上支持 Sql,首先它需要一个包含列名的表定义,如果它创建表,hive 元存储将获得很多不必要的表,因为 Spark-Sql 原生驻留在 hive 上。因此它将创建一个临时视图,该视图暂时在 hive 中可用并用作任何其他 hive 表,一旦 Spark Context 停止,它将被删除。
为了创建视图,开发人员需要一个名为 createOrReplaceTempView
【讨论】: