将信息保存到 Cassandra 不会保持顺序
Saving information to Cassandra keeps no order
我正在使用 Scala 并尝试将我的日历信息从 Spark 保存到 Cassandra。
我开始使用 Cassandra 创建相同的模式:
session.execute("CREATE TABLE calendar (DateNum int, Date text, YearMonthNum int, ..., PRIMARY KEY (datenum,date))")
然后将我的数据从 spark 导入到 Cassandra:
.write
.format("org.apache.spark.sql.cassandra")
.options(Map("table" -> "calendar", "keyspace" -> "ks"))
.mode(SaveMode.Append)
.save()
但是当我尝试读取从 Cassandra 上的 Spark 检索到的数据时,这些行看起来非常混乱,而我想保持日历的顺序不变。
我有一行的例子:
20090111 | 2009 年 1 月 11 日 | 200901 |...
Select/Order 似乎也没有解决问题。
Cassandra 中的数据仅在 Cassandra 分区内排序,但分区本身不按值排序,而是按分区键的哈希值组织。所以当你读取数据时,你可以读取附近的Cassandra分区,但它们可能属于完全不同的日期。
因此,如果您在 Spark 中对数据进行了排序,则需要使用 .orderBy
显式对数据进行排序
解决这个问题的方法是使用 Spark 在所有数据库中添加一个具有共同值的新列(例如:“1”),并使该列成为 Cassandra table 中的分区键,这样你为整个 table 获得一个分区,您的信息将保持有序。
我正在使用 Scala 并尝试将我的日历信息从 Spark 保存到 Cassandra。
我开始使用 Cassandra 创建相同的模式:
session.execute("CREATE TABLE calendar (DateNum int, Date text, YearMonthNum int, ..., PRIMARY KEY (datenum,date))")
然后将我的数据从 spark 导入到 Cassandra:
.write
.format("org.apache.spark.sql.cassandra")
.options(Map("table" -> "calendar", "keyspace" -> "ks"))
.mode(SaveMode.Append)
.save()
但是当我尝试读取从 Cassandra 上的 Spark 检索到的数据时,这些行看起来非常混乱,而我想保持日历的顺序不变。
我有一行的例子:
20090111 | 2009 年 1 月 11 日 | 200901 |...
Select/Order 似乎也没有解决问题。
Cassandra 中的数据仅在 Cassandra 分区内排序,但分区本身不按值排序,而是按分区键的哈希值组织。所以当你读取数据时,你可以读取附近的Cassandra分区,但它们可能属于完全不同的日期。
因此,如果您在 Spark 中对数据进行了排序,则需要使用 .orderBy
解决这个问题的方法是使用 Spark 在所有数据库中添加一个具有共同值的新列(例如:“1”),并使该列成为 Cassandra table 中的分区键,这样你为整个 table 获得一个分区,您的信息将保持有序。