Cassandra使用LEFT、charindex生成author_ref字段的查询错误排查
Cassandra查询语句问题排查及修正
原查询语句:
Select author_name, LEFT(author_name, charindex(' ', author_name)) from [author_by_id] as author_ref;
语句存在的问题
- 语法兼容问题:Cassandra的CQL语法不支持使用方括号
[]包裹表名,该写法是SQL Server等关系型数据库的专属语法,CQL中直接写表名author_by_id即可。 - 函数不支持问题:CQL原生没有
LEFT()、charindex()这两个关系型数据库常用的字符串函数,直接调用会报函数不存在的错误。 - 别名使用错误:语句中的
as author_ref是给表author_by_id设置别名,而非给新生成的截取字段设置别名,不符合你要生成author_ref新字段的需求。 - 持久化需求不匹配:如果你是希望给表新增持久化存储的
author_ref字段,这条SELECT语句仅能返回临时查询结果,无法修改表结构、也不能把计算结果写入存储。
修正方案
场景1:仅需要临时查询返回截取结果
可以用CQL原生支持的substring()和position()函数组合实现需求,注意CQL字符串下标从0开始,正确写法如下:
SELECT author_name, substring(author_name, 0, position(' ' IN author_name)) AS author_ref FROM author_by_id;
注:如果存在author_name没有空格的情况,position()会返回0,会返回空字符串,可以根据业务需要加逻辑处理边界场景。
场景2:需要新增持久化存储的author_ref字段
需要先修改表结构新增字段,再批量写入计算后的结果:
- 新增字段:
ALTER TABLE author_by_id ADD author_ref text;
- 批量读取所有记录的
author_name字段,计算出截取结果后再写回author_ref字段即可,数据量较大时建议结合Spark等批量计算工具处理。
内容的提问来源于stack exchange,提问作者PC245
相关产品推荐
相关产品推荐

