Ошибка приведения типов в Spark DataSet - PullRequest
0 голосов
/ 11 мая 2019

У меня есть сценарий использования, в котором я должен проверить, является ли значение поля длинным в строке или не таким, как «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());

Будет очень полезно, если кто-нибудь сможет дать мне указатель, поскольку я совсем новичок в зажигании.

...