当前位置: 首页 > 知识库问答 >
问题:

用于joinWithCassandraTable的分区键检索

澹台欣怿
2023-03-14

我有以下卡桑德拉表格:

CREATE TABLE listener.snapshots_geohash 
(
    created_date text, -- date when record have come to the system
    geo_part text, -- few signs of geo hash - just for partitioning
    when timestamp, -- record creation date
    device_id text, -- id of device produced json data (see snapshot column)
    snapshot text, -- json data, should be aggregated by spark
    PRIMARY KEY ((created_date, geo_part), when, device_id)
)

每天早上,聚合应用程序应该加载前一天的数据,并从快照列聚合JSON数据。聚合将按地理哈希对数据进行分组,这就是为什么它的部分被选为分区键的一部分。

我知道它是有效的加载数据从Cassandra通过使用join的Cassandratable-但为此我必须得到RDD构造从(created_date,geo_part)对。虽然我知道created_date值,我不能列出geo_part值-因为它只是一部分的地理散列和它的值是不连续的。所以我必须以某种方式运行选择不同的created_date,geo_part从ks.snapshots和创建RDD从它的结果。问题是如何运行这个选择与火花2.0.2和cassandra-连接器2.0.0-M3或可能有其他方法?

共有2个答案

赵炯
2023-03-14
val keys = sc.cassandraTable("listener","snapshots_geohash").select("created_date","geo_part").perPartitionLimit(1)

完整的解释见https://stackoverflow.com/a/56269424/17324。

贡建修
2023-03-14

我找到了通过使用CassandraConntor运行CQL查询来获取Cassandra分区密钥的方法:

 val cassandraConnector = CassandraConnector(spark.sparkContext.getConf)
 val distinctRows = cassandraConnector.withSessionDo(session => {
     session.execute(s"select distinct created_date, geo_part from ${keyspace}.$snapshots_table")
 }).all().map(row => {TableKeyM(row.getString("created_date"), row.getString("geo_part"))}).filter(k => {days.contains(k.created_date)})
 val data_x = spark.sparkContext.parallelize(distinctRows)

表结构设计有以下问题:Cassandra不允许添加created_date= ' ... '子句来选择不同的created_date、geo_part,并且需要获取完整的配对列表并在应用程序中进行过滤。

备选解决方案可以是使分区键连续。如果聚合将按小时进行,那么分区键可以是(创建日期,小时),24小时可以在应用程序中列出。如果每天24个分区是不够的,并且聚合有group by by geohash,那么可以坚持使用geohash的重要部分,但是应该将其转换为可计数的部分,例如geo part . hash()% desirenumberofsubpartitions

 类似资料:
  • 当我们基于某个键在流上应用组 by 函数时,kafka 如何计算这一点,因为相同的键可能存在于不同的分区中?我看到了()函数,它基本上对数据进行了重新分区,但我不明白它是什么意思。它会将具有相同键的所有消息移动到单个分区中吗?另外,我们可以通过()方法调用的频率如何?如果有要求,我们可以在收到每条消息后调用它吗?请建议。谢谢

  • 类似Bigtable的数据库存储按其键排序的行。 Cassandra使用分区和聚类键的结合来保持数据的分布和排序;但是,您只能通过使用分区键来选择行! 用于上述查询的Cassandra存储层的可视化。

  • 我有一个带有复合分区键的 cassandra 表(time_bucket 时间戳,节点 int)。time_bucket值是插入数据的时间,秒转换为 00,节点值范围为 0 到 100 spark作业每分钟运行一次,从表中提取数据。该表包含近2500万条记录,每分钟都有记录被添加。 如果我的 Spark 作业每次运行时都选择所有记录,则作业将在 2 分钟内完成。但是如果我使用: s < code

  • 我已经阅读了很多关于设计分区键和排序键的DynamoDB文档,但我认为我一定缺少一些基本的东西。 如果分区密钥设计不好,那么当单个分区密钥值的数据超过10GB时会发生什么情况? “了解分区行为”部分指出: “单个分区可以容纳大约10 GB的数据” 它如何对单个分区键进行分区? http://docs.aws.amazon.com/amazondynamodb/latest/developergui

  • 主要内容:使用位图的缺点动态分区的主要关注点是跟踪所有空闲和分配的分区。 但是,操作系统为此任务使用以下数据结构。 位图 链表 位图是存储细节最少见的数据结构。 在这个方案中,主存储器被分成分配单元的集合。 根据该过程的需要,可以将一个或多个分配单元分配给过程。 但是,分配单元的大小是由操作系统定义的,并且从不更改。 虽然分区大小可能会有所不同,但分配大小是固定的。 操作系统的主要任务是跟踪分区是空闲的还是空闲的。 为此