我有两个表:
activities (
org_id bigint,
user_id bigint,
lang text,
timestamp bigint,
...
PRIMARY KEY ((org_id, user_id), timestamp)
和
metadata (
user_id text,
org_id text,
lang text,
date_str text,
...
PRIMARY KEY ((user_id, org_id), date_str)
鉴于:
事件.行>>元数据.行
我需要
update metadata and set metadata.lang = activities.lang for all rows in metadata,
where metadata.user_id = activities.user_id and metadata.org_id = activities.org_id
问:什么是优雅的短 cql 查询来实现相同的目的?
我尝试过:
update metadata set metadata.lang = (select activities.lang from
activities where activities.user_id = metadata.user_id and activities.org_id = metadata.org_id)
这显然因违反基数而失败。
最佳答案
CQL 不支持此类更新语句(请参阅 docs )。您需要在 where
条件中提供实际值。
因此,您需要在代码中完成所有操作(获取数据、生成更新语句等),或者您可以使用 Spark 之类的东西,如下所示(未测试):
metadata = spark.read\
.format("org.apache.spark.sql.cassandra")\
.options(table="metadata", keyspace="test")\
.load()\
.select("user_id", "org_id")
activities = spark.read\
.format("org.apache.spark.sql.cassandra")\
.options(table="activities", keyspace="test")\
.load()\
.select("user_id", "org_id", "lang")
joined = activities.join(metadata,
(metadata["user_id"] == activitites["user_id"]) &
(metadata["org_id"] == activities["org_id"]), "inner")\
.select(metadata["user_id"], metadata["org_id"], "lang")
joined.write\
.format("org.apache.spark.sql.cassandra")\
.mode('append')\
.options(table="metadata", keyspace="test")\
.save()
关于sql - 根据 id 匹配时另一个表中的值更新表中的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67654994/