У меня есть сценарий использования, в котором я должен проверить, является ли значение поля длинным в строке или не таким, как «6». Я не могу проверить это на уровне схемы, так как это пользовательская проверка. Итак, для этого я делал проверку, сначала приводя атрибут к String и проверяя исключение, а затем анализируя значение в 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());
Будет очень полезно, если кто-нибудь сможет дать мне указатель, поскольку я совсем новичок в зажигании.