Apache spark SparkSQL:忽略/转换日期格式无效的行

Apache spark SparkSQL:忽略/转换日期格式无效的行,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我有一个列名为“date1”(timestamp(nullable=true))的表,格式如下 scala> sql("select date1 from tablename).show(20); +-------------------+ | date1 | +-------------------+ |2016-08-20 00:00:00| |2016-08-31 00:00:00| |2016-08-31 00:00:00| |2016-09-09 00:0

我有一个列名为“date1”(timestamp(nullable=true))的表,格式如下

scala> sql("select date1 from tablename).show(20);
+-------------------+
|        date1      |
+-------------------+
|2016-08-20 00:00:00|
|2016-08-31 00:00:00|
|2016-08-31 00:00:00|
|2016-09-09 00:00:00|
|2016-09-08 00:00:00|
在读取完整的配置单元表时,我遇到以下错误:

WARN TaskSetManager: Lost task 2633.0 in stage 4.0 (TID 7206, ip-10-0-0-241.ec2.internal, executor 11): TaskKilled (stage cancelled)
org.apache.spark.SparkException: Job aborted due to stage failure: Task 80 in stage 4.0 failed 4 times, most recent failure: Lost task 80.3 in stage 4.0 (TID 8944, ip-10-0-0-241.ec2.internal, executor 42): java.time.format.DateTimeParseException: Text '0000-12-30T00:00:00' could not be parsed, unparsed text found at index 10
.....
.....
Caused by: java.time.format.DateTimeParseException: Text '0000-12-30T00:00:00' could not be parsed, unparsed text found at index 10
  at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1952)
如何忽略/转换记录以便能够读取表


SparkVersion:2.2.1

这是一个源数据问题。尝试单独读取此列的全部数据并将其写入

scala> sql("select date1 from tablename).write.mode("overwrite").parquet("path/to/file.parquet")
如果这是此列的问题,那么您将得到错误

您尝试使用“0000-12-30T00:00:00”查询源数据

这显然是一个需要识别和删除的数据问题

您可以尝试在下面的查询中忽略这些行

sql("select date1 from tablename where date1 <> '0000-12-30T00:00:00'").count
sql(“从tablename中选择date1,其中date1'0000-12-30T00:00:00')。计数

这是一个源数据问题。尝试单独读取此列的全部数据并将其写入

scala> sql("select date1 from tablename).write.mode("overwrite").parquet("path/to/file.parquet")
如果这是此列的问题,那么您将得到错误

您尝试使用“0000-12-30T00:00:00”查询源数据

这显然是一个需要识别和删除的数据问题

您可以尝试在下面的查询中忽略这些行

sql("select date1 from tablename where date1 <> '0000-12-30T00:00:00'").count
sql(“从tablename中选择date1,其中date1'0000-12-30T00:00:00')。计数
您可以按以下方式尝试

sql(“从tablename”“”中选择cast(regexp_replace(date1,[T,Z]”,“”)作为时间戳)。show()

当它找到时,将用“”替换T/Z(空格),否则它什么也不做

希望这有帮助

您可以尝试以下方法

sql(“从tablename”“”中选择cast(regexp_replace(date1,[T,Z]”,“”)作为时间戳)。show()

当它找到时,将用“”替换T/Z(空格),否则它什么也不做


希望这有帮助

我通过运行query:sql(“selectdistinct(date1)fromtablename”).count确保这是数据问题。我只是在这方面有例外。所以这只是数据问题。我的问题是如何处理这样的问题。百万行中只有4行这样的行,我想完全忽略这些行。编辑我的答案,你们可以试试where子句。为了确保它不会引发问题,请将列作为字符串读取,消除它们,然后将其转换为日期。我通过运行query:sql(“select distinct(date1)from tablename”).count确保它是数据问题。我只是在这方面有例外。所以这只是数据问题。我的问题是如何处理这样的问题。百万行中只有4行这样的行,我想完全忽略这些行。编辑我的答案,你们可以试试where子句。为了确保它不会引发问题,请将列读为字符串,消除它们,然后将其转换为日期