Apache Spark SQL 不能 SELECT Cassandra 时间戳列

Apache Spark SQL can not SELECT Cassandra timestamp columns

我创建了 Docker 个容器,我在其中安装了 Apache Spark 3.1.2 (Hadoop 3.2),它托管了一个 ThriftServer,该服务器被配置为通过 spark-cassandra-connector(3.1.0) 访问 Cassandra。这些服务中的每一个都 运行 在它自己的容器中。所以我得到了 5 个容器(1x spark master,2x spark worker,1x spark thriftserver,1x cassandra),它们被配置为通过 docker-compose 存在于同一个网络中。 我使用 Apache Hive(1.2.1) 的直线客户端来查询数据库。一切正常,除了在 Cassandra 中查询类型为 timestamp.

的字段
org.apache.spark.SparkException: Job aborted due to stage failure: Task 9 in stage 0.0 failed 4 times, most recent failure: Lost task 9.3 in stage 0.0 (TID 53) (192.168.80.5 executor 0): java.lang.ClassCastException: java.sql.Timestamp cannot be cast to java.time.Instant

我检查了 Spark/spark-cassandra-connector 文档,但除了一个 configuration property called spark.sql.datetime.java8API.enabled

之外没有找到太多
If the configuration property is set to true, java.time.Instant and java.time.LocalDate classes of Java 8 API are used as external types for Catalyst's TimestampType and DateType. If it is set to false, java.sql.Timestamp and java.sql.Date are used for the same purpose.

我认为这个 属性 可能对我的情况有所帮助。尽管在文档中说默认值为 false,但在我的例子中该值始终为 true。我没有在任何地方设置它,我尝试在 $SPARK_HOME/conf/spark-defaults.conf 文件中用 false 覆盖它,并在启动 ThriftServer 时通过 --conf 命令行参数(和 master/worker 实例),但环境选项卡(位于 localhost:4040)始终显示为 true

有没有办法让Spark以一种不会导致异常的方式转换时间戳?在 SQL 中执行此操作很重要,因为稍后我想连接软件以进行数据可视化。

我发现 this JIRA 提到有一个错误转换时间,它在 3.1.2 中没有修复(3.1.3 尚未发布),但在 3.0.3 中。 我降级了 Apache Spark(3.0.3) 和 spark-cassandra-connector(3.0.1) 这似乎暂时解决了问题。