JSON без схемы для типа «строка» Apache Beam?
Есть ли способ преобразовать произвольные строки JSON без схемы в типы "Row" Apache Beam с помощью Java SDK? Если нет, можно ли получить тип схемы луча из существующего объекта?
Я нашел документацию для JsonToRow и ParseJsons , но для их работы требуется либо класс Schema, либо POJO. Я также обнаружил, что вы можете читать строки JSON в BigQuery TableRow, но, похоже, нет способа преобразовать TableRow в Row, который не предполагает наличия схемы.
Ответы
Нет, это невозможно, поскольку Row (и платформы, которые его используют) требуют знания схемы во время создания. Опция On - во время создания прочитать небольшую часть ваших данных, чтобы сделать вывод о вашей схеме, и использовать это для вызова вашего преобразования JsonToRow.
К сожалению, общий ответ кажется «нет», хотя есть некоторые конкретные ситуации, когда ответ может быть «да».
Проблема в том, что схемы не на 100% совместимы с типами данных JSON, в частности из-за типа поля ARRAY .
В JSON элементы списка могут иметь разные типы данных, но схемы в Beam требуют, чтобы каждый элемент был ARRAY одного типа. Этот тип может быть другим ROW или даже логическим типом , но все элементы должны быть одинаковыми.
К сожалению, использование ROW для замены ARRAY не совсем работает. Хотя поля ROW позиционны, они также называются, что приближает их к MAP. Кроме того, если ваш набор данных содержит списки JSON разной длины, вы получите каждую строку с разной схемой, что приведет к нежелательным последствиям.
Так что, если ваши данные JSON не используют списки произвольных типов, все должно быть в порядке. Тем не менее, Beam не предоставляет никаких утилит для получения схем из JSON, поэтому вам нужно будет создать это решение самостоятельно.
Я сталкиваюсь с этой точной ситуацией на работе, и я поддерживаю все, что вы сказали об ограниченных возможностях обработки JSON. Оказывается, Beam предоставляет что-то, что может преобразовать BigQuery TableRow / TableSchema в Beam Row / Schema . Если вы выберете это в качестве схемы и продолжите работу с JsonToRow, вам потребуется устранить несоответствие импеданса типов данных между типами данных JSON и Beam, созданными BigQueryUtils.fromTableSchema (BYTES, DATETIME, логические типы, созданные BigQueryUtils ).