【发布时间】:2021-08-04 02:09:49
【问题描述】:
我有一个字符串格式的 id 列表,这个列表大约有 20,000 个 id:
var timelineIds = source.map(a => a.timelineid);
timelineIds = timelineIds.distinct.cache; // disticnt list we need this for later
var timelineIdsString = timelineIds.map(a => a.asInstanceOf[String]).collect.toList;
当我对我的一个 cassandra 表使用此列表时,它工作得很好,无论timelineIdsString 的大小如何:
var timelineHistorySource = sc.cassandraTable[Timeline]("acd", "timeline_history_bytimelineid")
.select("ownerid", "userid", "timelineid", "timelinetype", "starttime", "endtime", "attributes", "states")
if (constrain)
timelineHistorySource = timelineHistorySource.where("timelineid IN ?", timelineIdsString)
当我对我的另一个表执行此操作时,当我在列表中有超过 1000 个 id 时,它永远不会完成:
var dispositionSource = sc.cassandraTable[DispositionSource]("acd","dispositions_bytimelineid")
.select("ownerid","dispositionid","month","timelineid","createddate","createduserid")
if(constrain)
dispositionSource = dispositionSource.where("timelineid IN ?", timelineIdsString);
两个 cassandra 表都有 key 作为时间线,所以我知道它是正确的。只要timelineids 是一个小列表,此代码就可以正常工作。
有没有更好的方法从 cassandra RDD 中过滤?是不是 IN 子句的大小导致它窒息?
【问题讨论】:
标签: scala apache-spark cassandra apache-spark-sql spark-cassandra-connector