Apache spark 如何在Spark的Cassandra查询中使用java.time.LocalDate?
我们在Cassandra中有一个表,其列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
开始时间类型为日期
当我们执行以下代码时:
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`