Spark DataSet中的类型转换问题

时间:2019-05-11 10:56:46

标签: apache-spark apache-spark-sql apache-spark-dataset

我有一个用例,其中我必须验证字段值在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());

如果有人可以为我提供一些指导,这真的很有帮助。

0 个答案:

没有答案