【发布时间】:2018-01-16 15:33:05
【问题描述】:
最近我来到 Spark SQL。 我阅读了数据源 API,但仍然对 Spark SQL 所扮演的角色感到困惑。
当我对我需要的任何东西执行 SQL 时,会先加载所有数据并在内存中执行 sql 吗?这意味着 spark sql 只是一个适用于已加载数据的内存数据库。还是每次都在本地扫描?
真的很愿意回答。
最好的问候。
【问题讨论】:
标签: apache-spark apache-spark-sql
最近我来到 Spark SQL。 我阅读了数据源 API,但仍然对 Spark SQL 所扮演的角色感到困惑。
当我对我需要的任何东西执行 SQL 时,会先加载所有数据并在内存中执行 sql 吗?这意味着 spark sql 只是一个适用于已加载数据的内存数据库。还是每次都在本地扫描?
真的很愿意回答。
最好的问候。
【问题讨论】:
标签: apache-spark apache-spark-sql
我阅读了数据源 API,但仍然对 Spark SQL 所扮演的角色感到困惑。
Spark SQL 不是数据库。它只是一个接口,允许您对存储在 Spark 特定的基于行的结构中的数据执行类似 SQL 的查询,称为 DataFrame
要通过 Spark 运行 SQL 查询,第一个要求是您尝试在其上运行查询的表应该存在于 Hive 元存储中(即该表应该存在于 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 您希望它如何存储数据。
【讨论】:
Spark-sql 只会缓存操作拉取的行,这意味着它将缓存操作期间必须读取的分区。这使您的第一次通话比您的第二次通话快得多
【讨论】: