最近我来到Spark SQL。 我阅读了数据源Api,但仍然对Spark SQL的作用感到困惑。
当我根据需要执行SQL时,会首先加载所有数据并在内存中执行sql吗?这意味着spark sql只是一个处理已加载数据的内存数据库。或者每次都在本地扫描?
非常愿意回答任何问题。
最诚挚的问候。
答案 0 :(得分:0)
我阅读了数据源Api,但仍然对Spark SQL的作用感到困惑。
Spark SQL不是数据库。它只是一个接口,允许您对存储在名为DataFrame
的Spark特定的基于行的结构中的数据执行类似SQL的查询
要通过Spark运行SQL查询,第一个要求是您尝试运行查询的表应该存在于Hive Metastore中(即该表应该存在于Hive中)或者它应该是临时视图,是当前SQLContext
/ HiveContext
。
因此,如果您有一个数据框df
并且想要对其运行SQL查询,则可以使用:
df.createOrReplaceTempView("temp_table") // or registerTempTable
然后您可以使用SQLContext
/ HiveContext
或SparkSession
对其进行查询。
spark.sql("SELECT * FROM temp_table")
Here's eliasah's answer that explains how createOrReplaceTempView
works internally
当我根据需要执行SQL时,会首先加载所有数据并在内存中执行sql吗?
根据您使用的持久性策略,数据将存储在内存中或磁盘上。如果您选择cache
表,则数据将存储在内存中,与从磁盘中提取数据的情况相比,操作会更快。无论如何,该部分是可配置的并且取决于用户。您基本上可以告诉Spark您希望它如何存储数据。
答案 1 :(得分:0)
Spark-sql只会缓存操作提取的行,这意味着它将缓存在操作期间必须读取的分区。这使您的第一次通话比第二次通话快得多