Соединитель Cassandra - разница между joinWithCassandraTable и leftJoinWithCassandraTable - не удается разрешить символ - PullRequest
1 голос
/ 11 февраля 2020

Я пытаюсь получить доступ к данным из Cassandra, присоединившись к соединителю dasastax cassandra. Код ниже работает для меня. Я пытаюсь суммировать значения столбцов из RDD и Cassandra после объединения

tm(a.joinWithCassandraTable("ks","tbl").on(SomeColumns("key","key2","key3","key4","key5","key6","key7","key8","key9","key10","key11","key12","key13","key14","key15","column1","column2","column3","column4","column5")).select("value1").map { case (ip, row) => IP(ip.key, ip.key2, ip.key3,ip.key4,ip.key5,ip.key6,ip.key7,ip.key8,ip.key9,ip.key10,ip.key11,ip.key12,ip.key13,ip.key14,ip.key15,ip.column1,ip.column2,ip.column3,ip.column4,ip.column5,ip.value1 + row.getLong("value1")) }.saveToCassandra("ks", "tbl"))

Однако, когда я пытаюсь выполнить левое соединение, он выдает символ "Cannot Resolve * getLong " I Полагаю, что это связано с тем, что левое соединение не гарантирует значение, поскольку оно может быть нулевым, но я не могу закодировать это в scala.

tm(a.leftJoinWithCassandraTable("ks","tbl").on(SomeColumns("key","key2","key3","key4","key5","key6","key7","key8","key9","key10","key11","key12","key13","key14","key15","column1","column2","column3","column4","column5")).select("value1").map { case (ip, row) => IP(ip.key, ip.key2, ip.key3,ip.key4,ip.key5,ip.key6,ip.key7,ip.key8,ip.key9,ip.key10,ip.key11,ip.key12,ip.key13,ip.key14,ip.key15,ip.column1,ip.column2,ip.column3,ip.column4,ip.column5,ip.value1 + row.getLong("value1")) }.saveToCassandra("ks", "tbl"))

Любая помощь приветствуется. Если потребуется какая-либо информация, дайте мне знать, и я постараюсь добавить

1 Ответ

2 голосов
/ 11 февраля 2020

когда вы не получаете данные в Кассандре, вы должны получить Option[Row] вместо Row объекта.

Вместо .map { case (ip, row) => ...} вы можете написать:

.map { case (ip, row) => 
  row match {
    case None => ip
    case Some(data) => IP(...., ip.value1 + data.getLong("value1"))
  }
}

в этом случае - когда у вас нет данных (None), вы просто возвращаете IP сам объект и если у вас есть данные, то вы создаете новый IP объект

...