Почему размер моего PCollection (SCollection) настолько велик по сравнению с размером ввода в BigQuery Table? - PullRequest
0 голосов
/ 12 мая 2018

enter image description here

Приведенное выше изображение представляет собой схему таблицы для большой таблицы запросов, которая является входом в задание потока данных Apache Beam, которое выполняется в scito spotify.Если вы не знакомы с scio, то это оболочка Scala для Apache Beam Java SDK.В частности, «SCollection оборачивает PCollection».Моя входная таблица на диске BigQuery составляет 136 гигабайт, но если посмотреть на размер моей коллекции SCollection в пользовательском интерфейсе потока данных, то она составляет 504,91 ГБ.enter image description here

Я понимаю, что BigQuery, вероятно, намного лучше при сжатии и представлении данных, но увеличение в> 3 раза кажется довольно высоким.Чтобы быть очень ясным, я использую тип Класса Big Query Case Class (назовем его Clazz), поэтому мой SCollection имеет тип SCollection [Clazz] вместо SCollection [TableRow].TableRow является нативным представлением в Java JDK.Любые советы о том, как сохранить распределение памяти?Это связано с определенным типом столбца в моих входных данных: байты, строки, записи, числа с плавающей запятой и т. Д.?

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Сериализация класса наблюдений с помощью Kryo не является наиболее эффективной, поскольку Kryo сериализует полное имя класса каждого объекта.Вы можете обойти это, зарегистрировав классы, которые проходят расширенные тасования.

https://github.com/spotify/scio/wiki/FAQ#how-do-i-use-custom-kryo-serializers

Это будет решено в Scio 0.7.x с новым производным кодировщика на основе макросов Magnolia.

https://github.com/spotify/scio/wiki/Coders

0 голосов
/ 12 мая 2018

Это, вероятно, связано с форматом TableRow, который содержит имена строк для столбцов, которые увеличивают размер.

Рассмотрим , используя следующие для создания PCollection объектов вместо TableRows,Это позволяет напрямую считывать объекты, соответствующие схеме, что должно немного уменьшить размер данных.

<code>  /**
   * Reads from a BigQuery table or query and returns a {@link PCollection} with one element per
   * each row of the table or query result, parsed from the BigQuery AVRO format using the specified
   * function.
   *
   * <p>Each {@link SchemaAndRecord} contains a BigQuery {@link TableSchema} and a
   * {@link GenericRecord} representing the row, indexed by column name. Here is a
   * sample parse function that parses click events from a table.
   *
   * <pre>{@code
   * class ClickEvent { long userId; String url; ... }
   *
   * p.apply(BigQueryIO.read(new SerializableFunction<SchemaAndRecord, ClickEvent>() {
   *   public ClickEvent apply(SchemaAndRecord record) {
   *     GenericRecord r = record.getRecord();
   *     return new ClickEvent((Long) r.get("userId"), (String) r.get("url"));
   *   }
   * }).from("...");
   * }
* / public static TypedRead read (SerializableFunctionparseFn) {
...