Swa*_*ilM 2 apache-spark apache-spark-sql pyspark
我有一个数据框,其列为“日期”以及其他一些列。
我想验证日期列值并检查格式是否为“dd/MM/yyyy”。如果日期列具有任何其他格式,则应将其标记为错误记录。因此,我使用选项option("dateFormat", "dd/MM/yyyy")接受上述格式的日期,并且它以“dd/MM/yyyy”格式正确接受日期,但如果我传递无效格式 (YYYY/ mm/dd) 仍然记录未标记为无效,并且传递的日期正在转换为垃圾
输入文件 :
colData1,2020/05/07,colData2,colData3
colData4,2020/05/07,colData5,colData6
colData7,2020/05/07,colData8,colData9
Run Code Online (Sandbox Code Playgroud)
df = spark.read.format(
"com.databricks.spark.csv").schema(customSchema).option(
"escape", '\"').option(
"quote", '\"').option(
"header", "false").option(
"dateFormat", "dd/MM/yyyy").option(
"columnNameOfCorruptRecord","badRecords").csv(
rdd)
df.show()
Run Code Online (Sandbox Code Playgroud)
数据帧 O/P :-
+--------+----------+--------+--------+----------+-----+
| OMIC| SMIC| VCLP| VName|badRecords|rowId|
+--------+----------+--------+--------+----------+-----+
|colData1|0012-11-09|colData2|colData3| null| 0|
|colData4|0012-11-09|colData5|colData6| null| 1|
|colData7|0012-11-09|colData8|colData9| null| 2|
+--------+----------+--------+--------+----------+-----+
Run Code Online (Sandbox Code Playgroud)
请建议
您无法通过dateFormat选项实现它,它接受2020/05/07但将格式更改为 invalid 0012-11-09。您可以尝试将SMIC列类型更改为StringType架构中的列类型,然后使用 function 将其转换为正确格式的日期to_date。
from pyspark.sql import functions as f
df2 = df.withColumn("badRecord", f.when(f.to_date(f.col("SMIC"),"dd/MM/yyyy").isNotNull, False).otherwise(True))
Run Code Online (Sandbox Code Playgroud)
输出:
+--------+----------+--------+--------+---------+
| OMIC| SMIC| VCLP| VName|badRecord|
+--------+----------+--------+--------+---------+
|colData1|2020/05/07|colData2|colData3| true|
|colData4|2020/05/07|colData5|colData6| true|
|colData7|2020/05/07|colData8|colData9| true|
|colData7|07/05/2020|colData8|colData9| false|
+--------+----------+--------+--------+---------+
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14826 次 |
| 最近记录: |