我有一个带有复合分区键的cassandra表(time_bucket timestamp,node int)。 time_bucket值是插入数据的时间,秒数转换为00,节点值范围为0到100
每分钟都会运行一个火花作业,从表中获取数据。该表包含近2500万条记录,每分钟都会添加记录。
如果我的spark作业每次运行时选择所有记录,则作业在2分钟内完成。但如果我查询使用:
取值c.cassandraTable(keyspace_name,table_name).where("time_bucket = ? ", from).where("nodeid_bucket IN ? ", nodeid_bucket_range)
其中val nodeid_bucket_range = 0到100,
这项工作需要10分钟才能完成。
我的群集有6个节点,我正在使用DSE 4.8.9。每个执行程序使用8个内核和20GB内存。增加这些值无助于使火花加工更快。
知道为什么我的工作需要10分钟?使用IN子句时spark-cassandra不能正常工作吗?
答案 0 :(得分:1)
你可能想要joinWithCassandraTable
。如果你有大量的值,那么通过连接几乎总能得到In
子句。这将在不同的执行程序上并行执行所有请求。
答案 1 :(得分:0)
IN
语句转换为key OR key OR key3 ... OR key100
,这对于优化程序创建有用的内容来说效率非常低。在您的情况下,您可以使用:
sc.cassandraTable(keyspace_name,table_name).where("time_bucket = ? ", from).where("nodeid_bucket > ? AND nodeid_bucket < ? ", nodeid_bucket_range)
观察范围的边缘,当然这假设您的范围是连续的。