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();