Я работаю в 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 создаст слишком много разделов ...
Спасибо!