0

У меня есть следующий код, который пытается соединить 2 таблицы cassandra в искры.Недопустимое значение null для ключа раздела раздела url

val imageKeywords = sc.cassandraTable[ImageMetadata]("images", "metadata") 
val imageAndPageKeywords = imageKeywords 
    .joinWithCassandraTable[PagesMetadata]("pages2", "metadata") 
    .on(SomeColumns("tid", "url" as "pu")) 

Классы случае я использую для отображения данных, как показано ниже

case class ImageMetadata(tid: String, iu: String, pu: Option[String], 
mk: List[String], fk: List[String], ak: List[String], ipk: List[String], pk: List[String], ik: List[String], ck: List[String]) 

case class PagesMetadata(tid: String, url: String, pk: List[String], uk: List[String], hk: List[String], ok: List[String], tc: List[String]) 

Я получаю сообщение об ошибке, когда я пытаюсь сделать некоторые операции, такие как ниже

imageAndPageKeywords.collect.toList.sortBy(_._1.tid).take(10).foreach(println) 

StackTrace ошибка -

причиненный: com.datastax.driver.core.e xceptions.InvalidQueryException: Недопустимое значение null для ключа ключа раздела url at com.datastax.driver.core.Responses $ Error.asException (Responses.java:103) at com.datastax.driver.core.DefaultResultSetFuture.onSet (DefaultResultSetFuture. java: 140) at com.datastax.driver.core.RequestHandler.setFinalResult (RequestHandler.java:293) at com.datastax.driver.core.RequestHandler.onSet (RequestHandler.java:455) at com.datastax. driver.core.Connection $ Dispatcher.messageReceived (Connection.java:734) на org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream (SimpleChannelUpstreamHandler.java:70) на org.jboss.netty.handler.timeout.IdleStateAwareChannelUpstreamHandler. handleUpstream (IdleStateAwareChannelUpstreamHandler.java:36) на или g.jboss.netty.channel.DefaultChannelPipeline.sendUpstream (DefaultChannelPipeline.java:564) на org.jboss.netty.channel.DefaultChannelPipeline $ DefaultChannelHandlerContext.sendUpstream (DefaultChannelPipeline.java:791) на org.jboss.netty.handler. timeout.IdleStateHandler.messageReceived (IdleStateHandler.java:294) на org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream (SimpleChannelUpstreamHandler.java:70) на org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream (DefaultChannelPipeline.java: 564) в org.jboss.netty.channel.DefaultChannelPipeline $ DefaultChannelHandlerContext.sendUpstream (DefaultChannelPipeline.java:791) в org.jboss.netty.channel.Channels.fireMessageReceived (Channels.java:296) в org.jboss. netty.handler.codec.oneone.OneToOneDecod er.handleUpstream (OneToOneDecoder.java:70) в org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream (DefaultChannelPipeline.java:564) в org.jboss.netty.channel.DefaultChannelPipeline $ DefaultChannelHandlerContext.sendUpstream (DefaultChannelPipeline.java: 791) на org.jboss.netty.channel.Channels.fireMessageReceived (Channels.java:296) на org.jboss.netty.handler.codec.frame.FrameDecoder.unfoldAndFireMessageReceived (FrameDecoder.java:462) в орг. jboss.netty.handler.codec.frame.FrameDecoder.callDecode (FrameDecoder.java:443) at org.jboss.netty.handler.codec.frame.FrameDecoder.messageReceived (FrameDecoder.java:303) at org.jboss. netty.channel.SimpleChannelUpstreamHandler.handleUpstream (SimpleChannelUpstreamHandler.java:70) at org. jboss.netty.channel.DefaultChannelPipeline.sendUpstream (DefaultChannelPipeline.java:564) на org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream (DefaultChannelPipeline.java:559) на org.jboss.netty.channel.Channels.fireMessageReceived (Channels.java:268) на org.jboss.netty.channel.Channels.fireMessageReceived (Channels.java:255) на org.jboss.netty.channel.socket.nio.NioWorker.read (NioWorker.java:88) на org.jboss.netty.channel.socket.nio.AbstractNioWorker.process (AbstractNioWorker.java:108) на org.jboss.netty.channel.socket.nio.AbstractNioSelector.run (AbstractNioSelector.java: 318) на org.jboss.netty.channel.socket.nio.AbstractNioWorker.run (AbstractNioWorker.java:89) на org.jboss.netty.channel.socket.nio.NioWorker.run (NioWorker.java: 178) at org.jboss.netty.util.ThreadRenamingRunnable.run (ThreadRenamingRunnable.java:108) at org.jboss.netty.util.internal.DeadLockProofWorker $ 1.run (DeadLockProofWorker.java:42) ... 3 более

ответ

2

Простой, исключение говорит вам, что он не может выполнить объединение, так как столбец используется для соединения ImageMetadata с PagesMetadata равны нулю.

В вашем случае, некоторые URL (о.е.) значения в ImageMetadata равны нулю.

Что странно, что вы определяете PagesMetadata с URL-адрес Nullable (Опция [String]), и кажется, что она является частью ключа

Одно решение первичной таблицы, чтобы заставить его работать будет :

val imageAndPageKeywords = imageKeywords 
    .filter(im -> im.pu.isDefined) 
    .joinWithCassandraTable[PagesMetadata]("pages2", "metadata") 
    .on(SomeColumns("tid", "url" as "pu")) 
+0

Есть ли способ, с помощью которого можно объединить работу? Я как бы пытался выяснить, разрешит ли Option (String) URL-адрес моей проблеме. – l0n3r4ng3r

+0

См. Отредактированный ответ – doanduyhai

+0

Вот что я делаю с учетом вашего предложения. 'вал imageKeywords = sc.cassandraTable [ImageMetadata] ("изображения", "метаданные")' ' вал pageKeywordsByTidUrl = imageKeywords.joinWithCassandraTable [PagesMetadata] ("pages2", "метаданные") .На (SomeColumns (" TID "," url "как" pu ")) .filter (f => f._1.pu.isDefined) .keyBy {x => Joinkey (x._1.tid, x._1.iu)}' Но по-прежнему та же ошибка – l0n3r4ng3r