registerTempTable 是不是会导致表被缓存?

Posted

技术标签:

【中文标题】registerTempTable 是不是会导致表被缓存?【英文标题】:Does registerTempTable cause the table to get cached?registerTempTable 是否会导致表被缓存? 【发布时间】:2016-11-07 21:59:39 【问题描述】:

我有一个 sql 语句查询,它正在对许多字段进行分组。它使用的表也很大(4TB 大小)。我正在将该表注册为临时表。但是,当我将其注册为临时表时,我不知道该表是否被缓存?我也不知道如果将查询转换为 Scala 函数(例如 df.groupby().aggr()...)而不是将其作为 sql 语句,它是否更高效。有什么帮助吗?

【问题讨论】:

【参考方案1】:

SQL 很可能是迄今为止最快的Databricks blog

您是否也尝试对数据帧进行分区/重新分区以查看它是否提高了性能?

关于 registerTempTable:它只在 spark 上下文中注册表。您可以通过 UI 进行检查。

val test = List((1,2,3),(4,5,6)).toDF("bla","blb","blc")
test.createOrReplaceTempView("test")
test.show()

存储是空白的

对比

val test = List((1,2,3),(4,5,6)).toDF("bla","blb","blc")
test.createOrReplaceTempView("test").cache()
test.show()

顺便说一下 registerTempTable 在 Spark 2.0 中已被弃用并已被替换为

createOrReplaceTempView

【讨论】:

当我尝试运行 df.createOrReplaceTempView("test").cache() 时,我得到一个异常 AttributeError: 'NoneType' object has no attribute 'cache'【参考方案2】:

我有一个 sql 语句查询,它正在对许多字段进行分组。它使用的表也很大(4TB 大小)。我正在将该表注册为临时表。但是,当我将它注册为临时表时,我不知道该表是否被缓存?

registerTempTabele 或 createOrReplaceTempView 不会将数据缓存到内存或磁盘本身,除非您使用 cache() 函数。

我也不知道如果我将查询转换为 Scala 函数(例如 df.groupby().aggr()...)而不是将其作为 sql 语句,它是否更高效。有什么帮助吗?

记住sql查询中的sql术语最终调用里面的函数。因此,您是否使用代码中可用的 sql 查询术语或函数都没有关系。那是一回事。

【讨论】:

以上是关于registerTempTable 是不是会导致表被缓存?的主要内容,如果未能解决你的问题,请参考以下文章

使用 spark-sql 缓存临时表

Zeppelin SqlContext registerTempTable 问题

达到表大小限制时,MYSQL 是不是会截断表?

在scala中使用数据框创建表[重复]

Spark DataFrame vector 类型存储到Hive表

使用外键发布新实体会导致创建另一个外部实体而不是引用现有实体