Apache spark 如何在Spark的Cassandra查询中使用java.time.LocalDate?

Apache spark 如何在Spark的Cassandra查询中使用java.time.LocalDate?,apache-spark,cassandra,apache-spark-sql,spark-cassandra-connector,Apache Spark,Cassandra,Apache Spark Sql,Spark Cassandra Connector,我们在Cassandra中有一个表,其列开始时间类型为日期 当我们执行以下代码时: val resultRDD = inputRDD.joinWithCassandraTable(KEY_SPACE,TABLE) .where("start_time = ?", java.time.LocalDate.now) 我们得到以下错误: com.datastax.spark.connector.types.TypeConversionException: Cannot convert obje

我们在Cassandra中有一个表,其列
开始时间
类型为
日期

当我们执行以下代码时:

val resultRDD = inputRDD.joinWithCassandraTable(KEY_SPACE,TABLE)
   .where("start_time = ?", java.time.LocalDate.now)
我们得到以下错误:

com.datastax.spark.connector.types.TypeConversionException: Cannot convert object 2016-10-13 of type class java.time.LocalDate to com.datastax.driver.core.LocalDate.
at com.datastax.spark.connector.types.TypeConverter$$anonfun$convert$1.apply(TypeConverter.scala:45)
at com.datastax.spark.connector.types.TypeConverter$$anonfun$convert$1.apply(TypeConverter.scala:43)
at com.datastax.spark.connector.types.TypeConverter$LocalDateConverter$$anonfun$convertPF$14.applyOrElse(TypeConverter.scala:449)
at com.datastax.spark.connector.types.TypeConverter$class.convert(TypeConverter.scala:43)
at com.datastax.spark.connector.types.TypeConverter$LocalDateConverter$.com$datastax$spark$connector$types$NullableTypeConverter$$super$convert(TypeConverter.scala:439)
at com.datastax.spark.connector.types.NullableTypeConverter$class.convert(TypeConverter.scala:56)
at com.datastax.spark.connector.types.TypeConverter$LocalDateConverter$.convert(TypeConverter.scala:439)
at com.datastax.spark.connector.types.TypeConverter$OptionToNullConverter$$anonfun$convertPF$29.applyOrElse(TypeConverter.scala:788)
at com.datastax.spark.connector.types.TypeConverter$class.convert(TypeConverter.scala:43)
at com.datastax.spark.connector.types.TypeConverter$OptionToNullConverter.com$datastax$spark$connector$types$NullableTypeConverter$$super$convert(TypeConverter.scala:771)
at com.datastax.spark.connector.types.NullableTypeConverter$class.convert(TypeConverter.scala:56)
at com.datastax.spark.connector.types.TypeConverter$OptionToNullConverter.convert(TypeConverter.scala:771)
at com.datastax.spark.connector.writer.BoundStatementBuilder$$anonfun$8.apply(BoundStatementBuilder.scala:93)
我已尝试根据以下内容注册自定义转换器:

但这没用


如何在Spark执行的Cassandra查询中使用JDK8日期/时间类?

Cassandra日期格式是
yyyy-MM-dd HH:MM:ss.SSS

因此,您可以使用下面的代码,如果您使用Java8将Cassandra日期转换为
LocalDate
,那么您可以执行逻辑

val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS")
val dateTime = LocalDateTime.parse(cassandraDateTime, formatter);

或者您可以将LocalDate转换为Cassandra日期格式并进行检查。

我认为在像这样的where子句中,最简单的方法就是调用

sc
 .cassandraTable("test","test")
 .where("start_time = ?", java.time.LocalDate.now.toString)
 .collect`
只需传入字符串,因为这将是一个定义良好的转换

TypeConverters中似乎存在一个问题,您的转换器没有优先于内置转换器。我来看看

--编辑--


似乎注册的转换器没有正确地转移给执行人。在本地模式下,代码按预期工作,这使我认为这是一个序列化问题。我会为此问题在Spark Cassandra连接器上开一张罚单。

在线转换后直接传递数据税日期如何?你不喜欢吗?首先,在代码的其他部分,我们使用JDK8日期/时间的类,所以我不想每次都转换它。第二,即使我传递DataStax LocalDate,我得到的
对象不可序列化(类:com.DataStax.driver.core.LocalDate,值:2016-10-13)
根据Cassadra
日期
格式描述为
日期字符串,如2015-05-03
。我错过了什么吗?@Marcinamatys:因为你只使用了日期而不是时间戳,请检查这个谢谢你的回复-它有效!我在@shankar回复后考虑了这个解决方案。但在我看来,我需要将
java.time.LocalDate
转换为
String
,然后
com.datasax.spark.connector.types.TypeConverter.LocalDateConverter
将其转换为
com.datasax.driver.core.LocalDate
sc
 .cassandraTable("test","test")
 .where("start_time = ?", java.time.LocalDate.now.toString)
 .collect`