【发布时间】: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