我有一个用例,其中我必须验证字段值在String中是否长或不像“ 6”。我不能直接在架构级别进行检查,因为它是自定义验证。因此,为此,我通过将属性强制转换为String并检查异常,然后将值解析为long来进行验证。
这里的问题是,如果数据集中只有一行具有该属性的long值,则它会按预期方式引发异常,但是如果有多行具有该属性的long和字符串值那么它会考虑将其视为String,并且不会引发异常。那可能是由于架构优先级。例如:数据已设置:
{"testField": 7}
下面的代码段抛出ClassCastException但具有数据集
{"testField": 7}
{"testField": "test"}
下面的代码片段没有抛出testField 7异常,而是在我调试它时发现它将此值当作String。
我尝试创建自己的架构并将其传递给数据集,但在那里也考虑了长为String的问题。
代码段:
public class Test implements FilterFunction<Row> {
@override
public void call(Row row) {
String longTypeInStringAttribute = row.getString(row.fieldIndex(field));
if (!isLong(longTypeInStringAttribute)) {
throw new InvalidDataFormatException();
}
}
}
Dataset<Row> dataset = sparkSession.read().json(inputPath);
dataset.filter(new Test());
如果有人可以为我提供一些指导,这真的很有帮助。