apache-spark - 如何在 spark 2.4.1 中将 jdbc/partitionColumn 类型设置为 Date
问题描述
我正在尝试使用 spark-sql-2.4.1 版本从 oracle 检索数据。我尝试将 JdbcOptions 设置如下:
.option("lowerBound", "31-MAR-02");
.option("upperBound", "01-MAY-19");
.option("partitionColumn", "data_date");
.option("numPartitions", 240);
但给出错误:
java.lang.IllegalArgumentException: Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff]
at java.sql.Timestamp.valueOf(Timestamp.java:204)
at org.apache.spark.sql.execution.datasources.jdbc.JDBCRelation$.toInternalBoundValue(JDBCRelation.scala:179)
然后尝试如下
.option("lowerBound", "2002-03-31"); //changed the date format
.option("upperBound", "2019-05-02");
.option("partitionColumn", "data_date");
.option("numPartitions", 240);
仍然没有运气。那么将日期传递为“下限/上限”的正确方法是什么?有没有办法指定/设置选项参数数据类型?
Part-2 正确检查选项。它们在执行查询之前被覆盖。于是改正了。...现在该错误已解决。
但对于以下选项:
.option("lowerBound", "2002-03-31 00:00:00");
.option("upperBound", "2019-05-01 23:59:59");
.option("timestampFormat", "yyyy-mm-dd hh:mm:ss");
请求参数 :
query -> ( SELECT * FROM MODEL_VALS ) T
它抛出另一个错误:
java.sql.SQLException: ORA-12801: error signaled in parallel query server P022, instance nj0005
ORA-01861: literal does not match format string
解决方案
如果您使用的是 Oracle,请参阅https://github.com/apache/spark/blob/master/external/docker-integration-tests/src/test/scala/org/apache/spark/sql/jdbc/OracleIntegrationSuite.scala #L441
val df1 = spark.read.format("jdbc")
.option("url", jdbcUrl)
.option("dbtable", "datetimePartitionTest")
.option("partitionColumn", "d")
.option("lowerBound", "2018-07-06")
.option("upperBound", "2018-07-20")
.option("numPartitions", 3)
// oracle.jdbc.mapDateToTimestamp defaults to true. If this flag is not disabled, column d
// (Oracle DATE) will be resolved as Catalyst Timestamp, which will fail bound evaluation of
// the partition column. E.g. 2018-07-06 cannot be evaluated as Timestamp, and the error
// message says: Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff].
.option("oracle.jdbc.mapDateToTimestamp", "false")
.option("sessionInitStatement", "ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD'")
.load()
推荐阅读
- asp.net-mvc - 我想在 MVC asp.net 中重写控制器操作方法
- ruby-on-rails - Nokogiri 将标签与分离
- spring-security - 从 Spring Security 身份验证日志中删除日志
- airflow - 为什么任务卡在气流中而不执行?
- javascript - 为什么我打开网页时 JavaScript 不运行?
- azure - 从任何零售店收据中提取结构化数据(Azure 计算机视觉 API OCR)
- python - pandas.Timestamp 是不可变的吗?
- javascript - Ramda:通过其(数组)属性复制对象
- c# - C# ASP - 动态按钮创建和分配事件处理程序
- ruby-on-rails - Rails 5.2:Rails UJS、Turbolinks 和 CSP