(SPARK) Каков наилучший способ разделения данных, к которым применяются несколько фильтров? - PullRequest
1 голос
/ 08 апреля 2019

Я работаю в Spark (на лазурных блоках данных) с файлом в 15 миллиардов строк, который выглядит следующим образом:

+---------+---------------+----------------+-------------+--------+------+
|client_id|transaction_key|transaction_date|   product_id|store_id|spend|
+---------+---------------+----------------+-------------+--------+------+
|        1|  7587_20121224|      2012-12-24|     38081275|     787| 4.54|
|        1| 10153_20121224|      2012-12-24|         4011|    1053| 2.97|
|        2|  6823_20121224|      2012-12-24|    561122924|     683| 2.94|
|        3| 11131_20121224|      2012-12-24|     80026282|    1131|  0.4|
|        3|  7587_20121224|      2012-12-24|        92532|     787| 5.49|

Эти данные используются для всех моих запросов, которые в основном состоят из groupby (product_id дляпример), сумма и число различны:

results = trx.filter(col("transaction_date") > "2018-01-01"
                     & 
                     col("product_id").isin(["38081275", "4011"])
             .groupby("product_id")
             .agg(sum("spend").alias("total_spend"),
                  countdistinct("transaction_key").alias("number_trx"))

Мне никогда не нужно использовать 100% этих данных, я всегда начинаю с фильтра:

  • транзакция_дата (1 000 различных значений)
  • product_id (1 000 000 различных значений)
  • store_id (1 000 различных значений)

==> Как лучше всего разделить эти данные в файле паркета?

Я изначально разбил данные на транзакция_даты :

trx.write.format("parquet").mode("overwrite").partitionBy("transaction_date").save("dbfs:/linkToParquetFile")

Это создаст разделы примерно одинакового размера.Однако для большинства запросов потребуется оставить не менее 60% транзакции_даты , тогда как в одном запросе обычно выбирается только несколько product_id .(70% store_id хранится обычно)

==> Есть ли способ создать файл паркета с учетом этого?

Кажется, что данные разбиваются на product_id создаст слишком много разделов ...

Спасибо!

1 Ответ

0 голосов
/ 08 апреля 2019

например, вы можете использовать несколько столбцов для разбиения (это создает подпапки), а spark может использовать фильтры разделов

другая хорошая идея - это сбор дополнительной информации здесь (чтобы избежать дополнительного перемешивания)

Пример с кустом

trx.write.partitionBy("transaction_date", "store_id").bucketBy(1000, "product_id").saveAsTable("tableName")

, чтобы прочитать его, используйте

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