У меня есть корзина s3 с разделенными данными, лежащими в основе Афины.Используя Афину, я вижу, что в моей таблице 104 миллиарда строк.Это около 2 лет данных.Давайте назовем это big_table
.
Разделение по дням, по часам, поэтому 07-12-2018-00,01,02 ... 24 для каждого дня.Поле Athena равно partition_datetime
.
. В моем случае мне нужны данные только за 1 месяц, что составляет около 400 миллионов строк.
Итак, возник вопрос - загрузите напрямую из: 1. files
spark.load(['s3://my_bucket/my_schema/my_table_directory/07-01-2018-00/file.snappy.parquet',\
's3://my_bucket/my_schema/my_table_directory/07-01-2018-01/file.snappy.parquet' ],\
.
.
.
's3://my_bucket/my_schema/my_table_directory/07-31-2018-23/file.snappy.parquet'])
или 2. через pyspark с использованием SQL
df = spark.read.parquet('s3://my_bucket/my_schema/my_table_directory')
df = df.registerTempTable('tmp')
df = spark.sql("select * from my_schema.my_table_directory where partition_datetime >= '07-01-2018-00' and partition_datetime < '08-01-2018-00'")
Я думаю, что # 1 более эффективен, потому что мы вводим данные только за рассматриваемый период.
2 мне кажется неэффективным, потому что все 104 миллиарда строк (или, точнее, поля partition_datetime) должны быть пройдены, чтобы удовлетворить SELECT.Мне советуют, что это действительно не проблема из-за ленивого выполнения, и никогда не будет df со всеми 104 миллиардами строк.Я все еще говорю, что в какой-то момент каждый раздел должен посещаться SELECT, поэтому вариант 1 более эффективен.
Меня интересуют другие мнения на этот счет.Пожалуйста, перезвоните