【问题标题】:Updating a column in a table based on its value from another table on id match根据 id 匹配的另一个表中的值更新表中的列
【发布时间】:2021-08-11 18:01:17
【问题描述】:

我有两张桌子:

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)

给定:activity.rows >> metadata.rows

我需要

update metadata and set metadata.lang = activities.lang for all rows in metadata, 
when 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)

这显然因违反基数而失败。

【问题讨论】:

  • 样本数据和预期结果将使问题更加清晰。

标签: sql cassandra cql cqlsh


【解决方案1】:

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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-23
    • 1970-01-01
    • 2010-09-18
    • 2017-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多