我正在尝试将cassandra中的大表迁移到新的空表(使用不同的主键),在相同的键空间和集群中,使用spark 1.2.1:
val rdd_table_a = sc.cassandraTable("keyspace", "table_a").filter(row => row.getLong("a") >= start_a && row.getLong("a") <= end_a)
rdd_table_a.map(row => {
val a = row.getLong("a")
val b = row.getLong("b")
val c = row.getString("c")
val d = row.getString("d")
val new_a = generateSomeNewValue(a)
connector.withSessionDo(session => {
val statement = session.prepare(s"INSERT INTO keyspace.table_b (new_a, c, b, a, d) " + "values (?, ?, ?, ?, ?)")
val bound = statement.bind(new_a, c, b, a, d)
session.executeAsync(bound)
})
}).foreach(x => x.getUninterruptibly())
该表有超过1B行,即使我尝试处理它的一小部分 - 它需要超过7小时。 我在文档中搜索并没有找到 - 在每个循环迭代中打开connector.withSessionDo的另一个会话吗?
上面的代码段中有什么瓶颈?
答案 0 :(得分:1)
$options = [
// ...
'foreignKey' => 'source_table_id',
'targetForeignKey' => 'target_table_id',
// ...
];
使用当前与Cassandra的共享连接执行自定义CQL查询:
允许以安全的方式使用Cassandra
conn.withSessionDo
,而不会忘记关闭它。通过此方法获取的Session
对象是与群集关联的共享单Session
的代理。在内部,共享底层
Session
将在所有代理关闭后不久关闭。
您可以使用Session
方法重写代码,这是更典型的方法。
至于我使用Spark + Cassandra的个人经验,此类查询的最慢点是Cassandra本身:大型表的数据扫描速度非常慢(与Parquet相比)。