这是关于我从Apache Spark查询Cassandra时遇到的一个问题。
来自Spark的普通查询工作正常,没有任何问题,但是当我使用条件查询时,我得到以下错误。 最初我尝试查询复合键列族,它也给出了与下面相同的问题。
“引起:InvalidRequestException(为什么:如果包含Equal,则empid不能被多个关系限制)”
专栏系列:
CREATE TABLE emp (
empID int,
deptID int,
first_name varchar,
last_name varchar,
PRIMARY KEY (empID));
列族内容:
empID, deptID, first_name, last_name
104, 15, 'jane', 'smith'
示例SCALA代码:
val job=new Job()
job.setInputFormatClass(classOf[CqlPagingInputFormat])
val host: String = "localhost"
val port: String = "9160"
ConfigHelper.setInputInitialAddress(job.getConfiguration(), host)
ConfigHelper.setInputRpcPort(job.getConfiguration(), port)
ConfigHelper.setInputColumnFamily(job.getConfiguration(), "demodb", "emp")
ConfigHelper.setInputPartitioner(job.getConfiguration(), "Murmur3Partitioner")
CqlConfigHelper.setInputColumns(job.getConfiguration(), "empid,deptid,first_name,last_name")
//CqlConfigHelper.setInputCQLPageRowSize(job.getConfiguration(), limit.toString)
CqlConfigHelper.setInputWhereClauses(job.getConfiguration(),"empid='104'")
// Make a new Hadoop RDD
val casRdd = sc.newAPIHadoopRDD(job.getConfiguration(),
classOf[CqlPagingInputFormat],
classOf[Map[String, ByteBuffer]],
classOf[Map[String, ByteBuffer]])
我恳请您告诉我是否有任何解决此类情况的工作,因为我在过去几天努力克服这个问题。
由于
答案 0 :(得分:1)
由于在Cassandra中翻译查询的方式而出现此错误(有关详细信息,请查看org.apache.cassandra.hadoop.cql3.CqlPagingRecordReader#whereClause
)。当查询转换为Cassandra时,它具有以下语法:
SELECT * FROM“emp”WHERE token(“empid”)> ? AND令牌(“empid”)< =? AND empid ='104'限制1000允许过滤
有一个相关的JIRA(CASSANDRA-6151)标记,不会修复,讨论解决问题的一些方法。从我发现的小documentation开始,CqlConfigHelper.setInputWhereClauses
只应用于不属于密钥的索引列。
我希望它有所帮助。