使用Apache Spark sql和Java直接运行sql查询

使用Apache Spark sql和Java直接运行sql查询,java,oracle,jdbc,apache-spark,apache-spark-sql,Java,Oracle,Jdbc,Apache Spark,Apache Spark Sql,我想知道如何直接用Spark SQL执行查询。我的意思是: SQLContext sql = new SQLContext(ctx); sql.sql("QUERY HERE"); 但是如何设置数据库的连接信息呢?我正在使用Oracle数据库。在我使用sql.read().jdbc..方法之前。在那里,我将连接URL作为参数传递。但是,与SQL控制台上的直接查询(0,05秒)相比,这种方式非常慢(4秒) Greetz您可能缺少Spark SQL的概念 它不是实时代理数据库的引擎。对于快速缓存,

我想知道如何直接用Spark SQL执行查询。我的意思是:

SQLContext sql = new SQLContext(ctx);
sql.sql("QUERY HERE");
但是如何设置数据库的连接信息呢?我正在使用Oracle数据库。在我使用
sql.read().jdbc..
方法之前。在那里,我将连接URL作为参数传递。但是,与SQL控制台上的直接查询(0,05秒)相比,这种方式非常慢(4秒)


Greetz

您可能缺少Spark SQL的概念

它不是实时代理数据库的引擎。对于快速缓存,您可能希望使用数据网格,如Oracle Coherence、Hazelcast或Apache Ignite(随机顺序)

Spark用于在海量数据集上进行快速计算。在03.10版的Databricks博客上,有一个使用CERN的Spark的用例——在数据库上运行12小时的大查询在Spark中只需要2分钟

那么,为什么您的查询很慢呢?Spark SQL更类似于OLAP系统,而不是OLTP。它可以非常快速地处理海量数据集。但是,必须从数据库中读取该数据,然后在Spark中进行计算。这就是为什么在您的例子中时间要大得多,它是加载时间+计算时间。数据库引擎可以一步完成读取和计算(当然,近似情况下,实现可能会有所不同)

当您拥有更多数据时,加载时间将小于执行时间的百分比,处理时间将大得多。斯帕克会尽力的。这是因为数据库引擎中的处理速度比Spark慢得多,Spark可以更好地并行化查询


如何调整查询?读取一次,然后缓存到内存中,然后在查询中使用。在小数据集上,速度可能会慢一些,但在大数据集上,如果大量使用此数据帧,则速度可能会慢一些

因此,如果现在数据将增加一倍或三倍或更多,火花将再次需要4秒?最后一部分。所以,在应用程序启动时,我缓存所有数据帧,比如
dataframedfcached=sql.read().jdbc(URL,“TABLE”,props.cache()并且从那时起只对该df有效?若更多数据将到达,Spark必须从数据库中读取它们。所以是的,2倍以上的数据=2倍的加载数据时间。但是请记住执行时间,这样可以节省大量时间。关于第二个问题——是的,没错。第一个查询将很慢(Spark将读取数据),但下一个查询将快得多。您可以执行
registerTempView
在SQL查询中使用dfCached
2x更多数据=2x加载数据的时间。
那么Spark的速度是2x?Atm即时通信测试全部使用一个从机。那么,有了更多的奴隶,火花会更快吗?第二个问题:但是对于经常变化的数据,缓存不是很好。Spark当然可以分发加载数据,但是更多的数据需要更多的时间。您必须在自己的环境中进行性能测试。是的,当数据经常变化时,Spark SQL并不好——它不是Spark SQL的一个用例。但是,也许Spark流媒体会很好?只接收新的数据片段并与历史数据合并我尝试了Spark Streaming,但不知道如何接收数据来构建Java对象。我有一个包含spark应用程序的tomcat。以及如何正确缓存。如果表是10gb大的,我无法将所有内容都放在内存中。如果我需要加入更多,我需要缓存更多。