我想使用SPARK SQL。我发现表现非常糟糕。
在我的第一个解决方案中: 当每个SQL查询到来时, 将数据从hbase实体加载到dataRDD, 然后将此dataRDD注册到SQLcontext。 最后执行spark SQL查询。 显然,解决方案非常糟糕,因为它每次都需要加载数据。
所以我改进了第一个解决方案
在我的第二个解决方案中,不考虑hbase数据更新和插入:
应用启动时,从HBASE entity to a dataRDD, named cachedDataRDD
加载当前数据
将cachedDataRDD注册到SQLcontext
当每个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注册到SQLcontext
最后执行spark SQL查询
但我发现联合转换会导致获取查询结果的收集操作非常慢。比hbase api查询慢得多。
有没有办法调整第三个解决方案性能?
通常在什么条件下使用spark SQL更好?
是否有使用spark SQL的好用例?
谢谢< / p>
答案 0 :(得分:0)
考虑为newDataRDD
创建一个新表,并在Spark SQL端执行UNION。因此,例如,不要联合RDD,请执行:
SELECT * FROM data
UNION
SELECT * FROM newData
这应该为查询优化器提供更多信息,并希望有助于提高查询速度。