【发布时间】:2016-08-24 15:39:45
【问题描述】:
引用 Spark DataFrames,Datasets and SQL manual:
少数 Hive 优化尚未包含在 Spark 中。一些 由于 Spark SQL 的原因,这些(例如索引)不太重要 内存计算模型。其他的被安排在未来的版本中 Spark SQL。
作为 Spark 的新手,我对此感到有些困惑,原因有两个:
Spark SQL 旨在处理大数据,至少在我的使用中 如果数据大小远远超过可用内存的大小。 假设这种情况并不少见,那么“Spark SQL 的 内存计算模型”?Spark SQL 是否仅推荐用于 数据适合内存的情况?
即使假设数据适合内存,对一个非常大的 数据集可能需要很长时间。我读了this argument反对 在内存数据库中建立索引,但我不相信。这个例子 那里讨论了对 10,000,000 条记录表的扫描,但这不是 真正的大数据。扫描具有数十亿条记录的表可能会导致 “SELECT x WHERE y=z”类型的简单查询需要永远代替 立即返回。
我了解索引有一些缺点,例如较慢的 INSERT/UPDATE、空间要求等。但在我的用例中,我首先将大量数据处理并加载到 Spark SQL 中,然后将这些数据作为一个整体进行探索,没有进一步的修改。 Spark SQL 对于数据的初始分布式处理和加载很有用,但缺乏索引使得交互式探索比我预期的更慢和更麻烦。
我想知道为什么 Spark SQL 团队认为索引在某种程度上不重要,以至于超出了他们的路线图。是否有不同的使用模式可以提供索引的好处,而无需独立实现等效的东西?
【问题讨论】:
-
Spark不是数据库。那么index是什么意思?您可以在 Spark 中编写一个索引原始文本文件的进程。您可以获取原始文本文件并将其保存为Parquet文件,并根据需要对数据进行分区。您还希望它为您做什么? -
@DavidGriffin 引用的部分是关于 Hive 优化的。 Spark SQL 将在 Hive 表上执行。所以 SparkSQL 不支持索引提供给 Hive 的优化。就是这个意思,并不是说 Spark 本身就是一个数据库
-
@DavidGriffin Spark SQL 提供了一个 SQL 抽象。不考虑实现的考虑和存储机制,我认为希望 Spark SQL 提供与 sql CREATE INDEX 语句等效的功能而不需要我自己实现它是合理的。
-
为什么这样合理?您可以在 Spark 中创建一个 Hive 表,然后转到 Hive 并在该表上创建一个索引吗?如果是这样,为什么这需要成为 Spark 的责任?我无法在 Spark 中创建 Kafka 主题或为 Kafka 主题添加/删除分区。我期望能够做到这一点是不合理的。
-
@David Griffin,请注意我在回复中没有提到 Hive,我认为这并不相关。我要说的是,索引通常可以节省大量时间,并且对于加快 SQL 查询非常有用。从我引用的段落看来,Spark SQL 团队认为索引对于实施和作为 Spark/BigData 新手来说并不重要,我想了解原因。我正在寻找诸如“由于 Spark 架构而实现起来很困难”、“索引对于典型的 Spark SQL 应用程序来说不够有用”或“索引已被其他更合适的工具覆盖”之类的答案。
标签: sql apache-spark apache-spark-sql in-memory-database