Как найти схему значений в DStream во время выполнения?
Я использую Spark 1.6 и Kafka 0.8.2.1.
Я пытаюсь получить некоторые данные из Kafka с помощью Spark Streaming и выполнить некоторые операции с этими данными.
Для этого я должен знать схему извлеченных данных, есть ли способ для этого или мы можем получить значения из потока, используя имена полей?
1 ответ
TL;DR Это невозможно напрямую (особенно со старой Spark 1.6), но не невозможно.
Кафка видит байты, и именно этого ожидает Spark Streaming. Вам нужно как-то передать некоторую дополнительную информацию о фиксированных полях, чтобы получить схему (возможно, в виде строки в кодировке JSON) и декодировать другое поле. Это не доступно из коробки, но конечно выполнимо.
В качестве предложения я бы отправил сообщение, где value
field всегда будет двухполевой структурой данных со схемой (поля значения) и самим значением (в формате JSON).
Затем вы можете использовать одну из функций from_json:
from_json (e: Column, schema: StructType): Column Анализирует столбец, содержащий строку JSON, в StructType с указанной схемой.
Дано from_json
был добавлен в Spark 2.1.0, вам нужно зарегистрировать свою собственную пользовательскую функцию (UDF), которая десериализовала бы строковое значение в соответствующую структуру (просто посмотрите, как from_json
делает это и копирует это).
Обратите внимание, что DataType
Объект поставляется с методом fromJson, который может "отобразить" строку в кодировке JSON в DataType
что бы описать вашу схему.
fromJson (json: String): DataType