我想使用SPARK SQL。我发现性能很差。
在我的第一个解决方案中:当每个 SQL 查询到来时,将数据从 hbase 实体加载到 dataRDD,然后将此 dataRDD 注册到 SQLcontext。最后执行火花SQL查询。显然,该解决方案非常糟糕,因为它每次都需要加载数据。
所以我改进了第一个解决方案。
在我的第二个解决方案中,不要考虑 hbase 数据更新和插入:
当应用程序启动时,从HBASE entity to a dataRDD, named cachedDataRDD
加载当前数据。
将cachedDataRDD注册到SQL上下文
当每个 SQL 查询到来时,执行 Spark SQL 查询。性能非常好。
但是某些实体需要考虑更新和插入。
所以我根据第二个解决方案更改了解决方案。
在我的第三个解决方案中,需要考虑 hbase 数据更新和插入:
当应用程序启动时,从HBASE entity to a dataRDD, named cachedDataRDD
加载当前数据。
当 SQL 查询到来时,加载the new updates and inserts data to another dataRDD, named newDataRDD.
然后set cachedDataRDD = cachedDataRDD.union(dataRDD);
将cachedDataRDD注册到SQL上下文
最后执行火花SQL查询。
但是我发现联合转换会导致获取查询结果的收集操作非常慢。比 hbase API 查询慢得多。
有没有办法调整第三个解决方案的性能?
通常在什么条件下使用火花SQL更好?
使用SparkSQL有什么好的用例吗?
谢谢
考虑为 newDataRDD
创建一个新表,并在 Spark SQL 端执行 UNION。例如,与其联合RDD,不如执行以下操作:
SELECT * FROM data
UNION
SELECT * FROM newData
这应该为查询优化器提供更多信息,并希望有助于加快查询速度。