Более эффективная запись разделенного паркета при перекосе столбца - PullRequest
0 голосов
/ 10 июля 2019

Я работаю над написанием большой таблицы (примерно 1,2b строк) в партике с разделами, я использую штат (например, штат США) в качестве ключа разделения. Проблема в том, что существует большое количество нулевых значений состояния. Эта таблица часто запрашивается по состоянию, поэтому наличие большого раздела с нулевыми состояниями не является проблемой, но у меня возникают проблемы с более эффективной генерацией таблицы.

Я пытался создать таблицу с ненулевыми состояниями, затем вставить нулевое значение, но из того, что я могу сказать, все нулевые значения все еще просто помещаются в один большой раздел и, следовательно, отправляются одному работнику.

Было бы замечательно, если бы был способ вставить в определенный раздел. Как и в моем примере, запишите ненулевые состояния, затем вставьте оставшиеся записи в state = null или hive_default_partition таким образом, чтобы все равно распараллеливаться в кластере.

1 Ответ

0 голосов
/ 10 июля 2019

Попробуйте записать ненулевые данные, используя автоматическое разбиение, затем разделите нулевые данные и запишите их отдельно, например ::

.
df.where($”state”.isNotNull).write.partitionBy($”state”).parquet(“my_output_dir”)
df.where($”state”.isNull).repartition(100).write.parquet(“my_output_dir/state=__HIVE_DEFAULT_PARTITION__”)

Используя SQL API, вы можете использовать подсказку перераспределения (введенную в Spark 2.4) для достижения того же:

spark-sql> describe skew_test;  
id  bigint  NULL
dt  date    NULL
state   string  NULL
# Partition Information     
# col_name  data_type   comment
state   string  NULL
Time taken: 0.035 seconds, Fetched 6 row(s)
spark-sql> CREATE TABLE `skew_test2` (`id` BIGINT, `dt` DATE, `state` STRING)
         > USING parquet
         > OPTIONS (
         >   `serialization.format` '1'
         > )
         > PARTITIONED BY (state);
Time taken: 0.06 seconds
spark-sql> insert into table skew_test2  select * from skew_test where state is not null;
Time taken: 1.208 seconds
spark-sql> insert into table skew_test2  select /*+ REPARTITION(100) */ * from skew_test where state is  null;
Time taken: 1.39 seconds

Вы должны увидеть 100 заданий, созданных Spark для окончательного утверждения, а ваша директория state=__HIVE_DEFAULT_PARTITION__ должна содержать 100 файлов паркета. Для получения дополнительной информации о подсказках Spark-SQL, проверьте https://jaceklaskowski.gitbooks.io/mastering-spark-sql/spark-sql-hint-framework.html#specifying-query-hints

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...