当前位置: 首页 > 知识库问答 >
问题:

如何处理AWS Glue-PySpark中的'0000-00-00'

冯澄邈
2023-03-14

我正在使用AWS glue读取AWS Aurora DB(MySQL)表并写入S3文件。MySQL表具有日期列值'0000-00-00',这在MySQL中是允许的。由于这个原因,我的胶水工作(PySpark)失败了。如何在胶水代码中处理这个?

下面的错误信息

Traceback (most recent call last):
File "script_2018-08-03-21-41-06.py", line 107, in <module>
total_record_count=datasourceDF0.count()
File "/mnt/yarn/usercache/root/appcache/application_1533330570684_0005/container_1533330570684_0005_01_000001/pyspark.zip/pyspark/sql/dataframe.py", line 427, in count
File "/mnt/yarn/usercache/root/appcache/application_1533330570684_0005/container_1533330570684_0005_01_000001/py4j-0.10.4-src.zip/py4j/java_gateway.py", line 1133, in __call__
File "/mnt/yarn/usercache/root/appcache/application_1533330570684_0005/container_1533330570684_0005_01_000001/pyspark.zip/pyspark/sql/utils.py", line 63, in deco
File "/mnt/yarn/usercache/root/appcache/application_1533330570684_0005/container_1533330570684_0005_01_000001/py4j-0.10.4-src.zip/py4j/protocol.py", line 319, in get_return_value
py4j.protocol.Py4JJavaError: An error occurred while calling o335.count.

: org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 7.0 failed 4 times, most recent failure: Lost task 0.3 in stage 7.0 (TID 21, ip-172-24-120-182.us-west-2.compute.internal, executor 1): java.sql.SQLException: Value '0000-00-00' can not be represented as java.sql.Timestamp
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:996)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:935)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:924)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:870)
at com.mysql.jdbc.ResultSetRow.getNativeTimestamp(ResultSetRow.java:606)
at com.mysql.jdbc.ByteArrayRow.getNativeTimestamp(ByteArrayRow.java:187)
at com.mysql.jdbc.ResultSetImpl.getNativeTimestamp(ResultSetImpl.java:4309)
at com.mysql.jdbc.ResultSetImpl.getTimestampInternal(ResultSetImpl.java:5929)
at com.mysql.jdbc.ResultSetImpl.getTimestamp(ResultSetImpl.java:5609)

共有1个答案

漆雕嘉平
2023-03-14

验证在crownler表架构中设置字段的格式。设置为字符串。这样就不会再有解析错误了。选择函数df.selectexpr()的列,并根据需要格式化数据。一些Spark SQL表达式:

  • date_format
  • to_unix_timestamp
  • from_unixtime
 类似资料:
  • 我得到了这个例外: 源自此代码: 其中是一个。 所以这对我来说很好-我知道数据库中有零日期,我需要能够读取这些数据并将它们转换为下游数据结构中适当的(可能为空)数据。问题是我不知道如何检索它并得到一个“软”错误。我曾考虑将这一行包装成try/catch for SQLException,但我知道这会破坏ResultSet的有效性。 是否可以以另一种方式读取此值而不引发SQLException?

  • 问题内容: 这是一个测试代码: 提供: 但这不是一个有效的日期。我不了解返回的值,尤其是月份……您能解释一下吗? 问题答案: 您在这里看到两种效果。第一个是您使用一种可以以多种形式书写的日期书写方式: 因此,根据日期本身,您已经指定了11月30日-1。 现在剩下的时间偏移大约为9分21秒。这是因为与1911年3月10日当地时间发生的巴黎/法国UTC相比,时钟发生了变化。 我稍微修改了您的代码示例,

  • 问题内容: 如何将字段的默认值设置为“ 0000-00-00 00:00:00”?如果我们不能使用“ 0000-00-00 00:00:00”作为默认值?什么是 基本 有效tiemdate? 例如,这是用于创建我的商品表的SQL, 运行此查询时出现此错误, 问题答案: 错误原因:SQL模式 您可以设置的默认值,或场特殊的“零”作为虚拟日期“0000-00-00”值,如果SQL模式允许它。对于低于5

  • 我有一个包含日期的数据库表 有没有什么方法可以在不改变表结构的情况下获得?

  • 问题内容: 我需要在数据库上更改一些值。 我忘记为表格设置可空值,并且默认情况下将其设置为0000-00-00 00:00:00。 现在,我需要将该值转换为。 字段类型为“日期时间”。 我该怎么做? 我尝试使用典型的方法,但是它不起作用。 问题答案: 您首先需要将该列设置为可空: 然后更新值:

  • 问题内容: 字段定义 二传手 有谁知道如何将“零日期”转换为适当的值?因为我有错误: 即使我像这样设置“默认”字段和设置器: 我仍然会有同样的问题。 问题答案: 在这里,我将大胆猜测您正在使用MySQL :-)它使用“零日期”作为特殊占位符 -不幸的是,JDBC默认情况下无法处理它们。 解决方案是将“ zeroDateTimeBehavior = convertToNull”指定为MySQL连接的