【问题标题】:Cassandra spark connector joinWithCassandraTable on field with differents nameCassandra spark 连接器 joinWithCassandraTable 在具有不同名称的字段上
【发布时间】:2015-11-19 11:24:31
【问题描述】:

我正在寻找一个 RDD 和一个 cassandra 表的连接,它们对于同一个键具有不同的名称 ex(简化):

case class User(id : String, name : String)

case class Home( address : String, user_id : String)

如果想做的话:

rdd[Home].joinWithCassandraTable("testspark","user").on(SomeColumns("id"))

我怎样才能准确地指定要进行联接的字段的名称。 而且我不想将 rdd 映射为只有正确的 id,因为我想在 joinWithCassandraTable 之后加入所有值。

【问题讨论】:

标签: scala cassandra apache-spark datastax-enterprise spark-cassandra-connector


【解决方案1】:

您可以尝试在读取 Cassandra 表时更改列名,使其与您要加入的 RDD 字段匹配:

例如:

import org.apache.spark.sql.cassandra.CassandraSQLContext
val sc: SparkContext = ...
val cc = new CassandraSQLContext(sc)
val rdd: SchemaRDD = cc.sql("SELECT user_id AS id, <other columns> from testspark.user WHERE ...")

【讨论】:

    【解决方案2】:

    您可以像在选择中一样使用“as”语法来更改连接列的映射。

    一个例子

    sc.cassandraTable[Home]("ks","home").joinWithCassandraTable("ks","user").on(SomeColumns("id" as "user_id")).collect
    

    将用户表中的“id”列映射到Home案例类中的“user_id”字段。

    【讨论】:

    • 感谢您的回答。 joinWithCassandraTable 是否也适用于小型结果数据集(少于 10 行)?是否可以将案例类(udt)作为连接键?
    • 它适用于小型数据集,这是否会执行取决于您的分区长度。如果连接器可以读取 udt,它应该可以工作。
    • 连接查询或普通火花连接将执行基于排序合并的洗牌,这需要读取整个事物表。与 Cassandra 表联接仅使用分区键来查找行。 DSE 有一个优化,可以将一些 sql 连接转换为与 Cassandra 连接,但这不在 OSS 版本中
    猜你喜欢
    • 1970-01-01
    • 2015-12-27
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 2023-03-11
    • 2014-11-11
    • 1970-01-01
    相关资源
    最近更新 更多