如何使用 Spark SQL 作为内存数据库?

Posted

技术标签:

【中文标题】如何使用 Spark SQL 作为内存数据库?【英文标题】:How to use Spark SQL as in-memory database? 【发布时间】:2018-04-24 11:01:51 【问题描述】:

我正在尝试理解 Spark SQL 的概念,并且想知道是否可以将 Spark SQL 用作内存数据库,类似于 H2/SQLite?

处理完 100 个文件中的所有记录后,我可以将数据保存为表格格式,并且可以查询表以获取结果,而不是搜索文件。这有意义吗?

Dataset<Row> results = spark.sql("SELECT distinct(name) FROM mylogs");

在运行时,如果用户选择从表“mylogs”中获取不同的名称,它应该从表中获取(而不是从派生表的基础文件中)。

我注意到,Spark SQL 确实会扫描文件以再次获取数据,直到它扫描所有 100 个文件并获取数据,用户必须等待响应。

这是 Spark 的用例吗?有没有更好的方法来实现这一点?

【问题讨论】:

使用缓存/持久临时表或在内存中查看,如果大小不是太大并且表在其生命周期的大部分时间里都是只读的。 你可以,但这将是一个非常糟糕的选择。它不是数据库,也绝对不是内存数据库,即使与这些有一些共同点。 【参考方案1】:

理论上这是可行的,您可以将 Spark SQL 用作内存数据库。如果数据在某个时候消失了,而您必须再次重新查询这 100 个文件,我不会感到惊讶。

您可以进行配置,在其中对 100 个文件执行查询,然后 cache / persist 查询结果以避免扫描。

这就是 Spark Thrift Server 的工作原理,因此您应该阅读Running the Thrift JDBC/ODBC server 的文档。

【讨论】:

javaRDD.persist(StorageLevel.MEMORY_ONLY()); - 在使用它之后,它仍然在运行时扫描文件。那是我发布这个问题的时候。 显示您正在执行的整个命令序列。你怎么知道扫描是在运行时完成的?编辑您的问题并添加必要的详细信息。谢谢! 对不起,我现在无法复制它,在发布查询后我对代码做了一些更改。订单的执行发生了变化,删除了延迟加载,我想其中一个变化起到了作用。但是 javaRDD.persist(StorageLevel.MEMORY_ONLY());从一开始就在那里。

以上是关于如何使用 Spark SQL 作为内存数据库?的主要内容,如果未能解决你的问题,请参考以下文章

在脚本中迭代/循环 Spark parquet 文件会导致内存错误/堆积(使用 Spark SQL 查询)

在 Spark SQL 中读取 40 万行时出现内存不足错误 [重复]

Spark SQL:使用“order by”提高缓存内存占用

如何在使用 SQLite 作为内存数据库的 ABP 框架上集成测试接受 SQL 参数的方法?

spark sql 性能调优

使用 spark.sql.autoBroadcastJoinThreshold 时 Spark Driver 不释放内存