我有一个sql语句查询,它在许多字段上执行分组。它使用的表也很大(大小为4TB)。我正在将表注册为临时表。但是当我将它注册为临时表时,我不知道表是否被缓存?如果我将查询转换为Scala函数(例如df.groupby()。aggr()...)而不是将其作为sql语句,我也不知道它是否更高效。对此有何帮助?
答案 0 :(得分:8)
SQL很可能是迄今为止最快的Databricks blog
您是否尝试对数据框进行分区/重新分区,以确定它是否会提高性能?
关于registerTempTable:它只在spark上下文中注册表。您可以查看用户界面。
val test = List((1,2,3),(4,5,6)).toDF("bla","blb","blc")
test.createOrReplaceTempView("test")
test.show()
存储空白
vs
val test = List((1,2,3),(4,5,6)).toDF("bla","blb","blc")
test.createOrReplaceTempView("test").cache()
test.show()
顺便说一句,registerTempTable在Spark 2.0中已被弃用,并已被
取代createOrReplaceTempView
答案 1 :(得分:1)
我有一个sql语句查询,它在许多字段上执行分组。它使用的表也很大(大小为4TB)。我将表注册为临时表。但是,当我将表注册为临时表时,我不知道该表是否被缓存了?
除非使用cache()函数,否则registerTempTabele或createOrReplaceTempView不会将数据缓存到内存或光盘本身。
如果我将查询转换为Scala函数(例如df.groupby()。aggr()...)而不是将其作为sql语句,我也不知道它是否更高效。对此有何帮助?
请记住sql查询中的sql术语最终调用里面的函数。所以无论你使用sql查询术语还是代码中可用的函数都没关系。这是一回事。