JSON в NDJSON на облачной платформе Google

Я разрабатываю прототип на облачной платформе Google, для которой я использую облачное хранилище, appengine и bigquery.

Теперь одна из задач - ежедневно загружать файл из облачного хранилища Google в bigquery, для которого я использую задачу Cron в Appengine.

Проблема в том, что bigquery ожидает, что данные будут в формате NDJSON (новая строка с разделителем json), а мой исходный файл - в обычном формате JSON.

В настоящее время я загрузил файл на свой ноутбук и преобразовал его в NDJSOn, а затем загрузил в bigquery, но как мне сделать это программно на платформе Google Clould? Я надеюсь, что есть что-то доступное, что я могу использовать, так как я не хочу писать с нуля.

1 ответ

Может быть полезным для других. Вот как я это сделал, но дай мне знать, есть ли лучший или более простой способ сделать это. Необходимо скачать Java-API облачного хранилища и зависимости (API-интерфейсы HTTP и API-интерфейсы oauth): https://developers.google.com/api-client-library/java/apis/

Нужно скачать парсер JSON как у Джексона.

Шаги:

1> Считайте файл json в качестве входного потока, используя API облачного хранилища java.

Storage.Objects.Get getObject = client.objects().get("shiladityabucket", "abc.json");
InputStream input = getObject.executeMediaAsInputStream();

2> Конвертировать в массив объектов Java (в моем случае файл json имеет несколько записей). Если это одна запись, нет необходимости в массиве.

ObjectMapper mapper = new ObjectMapper();
BillingInfo[] infoArr = mapper.readValue(input, BillingInfo[].class);

3> Создать StorageObject для загрузки в облачное хранилище

StorageObject objectMetadata = new StorageObject()
            // Set the destination object name
            .setName("abc.json")
            // Set the access control list to publicly read-only
            .setAcl(Arrays.asList(
                    new ObjectAccessControl().setEntity("allUsers").setRole("READER")));    

4> перебирать объекты в массиве и конвертировать их в строку json. Добавить новую строку для ndjson.

for (BillingInfo info:infoArr) {            
    jSonString += mapper.writeValueAsString(info);
    jSonString += "\n";                 
}   

5> Создать Inputstream для вставки с использованием облачного хранилища Java API

InputStream is = new ByteArrayInputStream(jSonString.getBytes());
InputStreamContent contentStream = new InputStreamContent(null, is);

6> Загрузить файл

Storage.Objects.Insert insertRequest = client.objects().insert(
                "shiladitya001", objectMetadata, contentStream);
insertRequest.execute();                
Другие вопросы по тегам