Spark 3.1字符串转日期数组判断incoming_date存在性报错如何解决
Spark 3.1 Java 判断日期列是否在指定日期列表中的解决方案
错误原因分析
- 方法1报错原因:
LocalDate.parse返回的是java.time.LocalDate类型,和你声明的java.util.Date数组类型不兼容,触发数组存储异常。 - 方法2报错原因:
SimpleDateFormat的模式字符串错误:YYYY代表周年、DD代表年积日,正确的日期格式应该是yyyy-MM-dd;array_contains函数参数顺序颠倒:该函数第一个参数是待查询的数组,第二个参数是要匹配的元素;- Spark SQL不支持直接传入Java原生的
java.util.Date数组作为函数参数,需要转成Spark可识别的日期字面量数组。
正确实现代码
方式1:直接构造Spark日期字面量数组(推荐,无需额外Java日期转换)
import org.apache.spark.sql.functions; import static org.apache.spark.sql.functions.lit; import static org.apache.spark.sql.functions.array_contains; import java.util.Arrays; import java.util.stream.Collectors; // 原日期字符串 String Dates = "2021-07-06,1889-03-30"; // 拆分字符串后转成Spark Date类型的字面量数组 org.apache.spark.sql.Column dateArray = functions.array( Arrays.stream(Dates.split(",")) .map(dateStr -> functions.to_date(lit(dateStr))) .collect(Collectors.toList()) .toArray(new org.apache.spark.sql.Column[0]) ); // 新增result列 dataset = dataset.withColumn("result", array_contains(dateArray, col("incoming_date")));
方式2:先转Java LocalDate再传入
import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.Arrays; import java.util.stream.Collectors; import static org.apache.spark.sql.functions.lit; import static org.apache.spark.sql.functions.array_contains; import static org.apache.spark.sql.functions.array; String Dates = "2021-07-06,1889-03-30"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); org.apache.spark.sql.Column dateArray = array( Arrays.stream(Dates.split(",")) .map(dateStr -> LocalDate.parse(dateStr, formatter)) .map(localDate -> lit(localDate)) .collect(Collectors.toList()) .toArray(new org.apache.spark.sql.Column[0]) ); dataset = dataset.withColumn("result", array_contains(dateArray, col("incoming_date")));
执行后即可得到预期的result列,匹配到指定日期返回true,未匹配返回false。
内容的提问来源于stack exchange,提问作者Sweety
相关产品推荐
相关产品推荐

