【问题标题】:Apache Spark SQL can not SELECT Cassandra timestamp columnsApache Spark SQL 无法选择 Cassandra 时间戳列
【发布时间】:2021-10-07 20:52:59
【问题描述】:

我创建了 Docker 容器,在其中安装了 Apache Spark 3.1.2 (Hadoop 3.2),该容器托管了一个 ThriftServer,该 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。我没有在任何地方设置它,我尝试在启动 ThriftServer(和主/工作实例)时用$SPARK_HOME/conf/spark-defaults.conf 文件中的false--conf 命令行参数覆盖它,但是环境选项卡(在localhost:4040) 始终显示为 true

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

【问题讨论】:

    标签: apache-spark cassandra spark-cassandra-connector


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2015-03-28
      • 1970-01-01
      • 2017-08-05
      • 2015-09-09
      • 2013-10-18
      • 2017-07-10
      • 2019-05-25
      • 2023-03-05
      • 2018-03-04
      相关资源
      最近更新 更多