Загрузка Spark DF из S3, несколько файлов.Какой из этих подходов лучше? - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть корзина 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 более эффективен.

Меня интересуют другие мнения на этот счет.Пожалуйста, перезвоните

Ответы [ 3 ]

0 голосов
/ 30 ноября 2018

Том, ты прав.# 1 является более эффективным и способ сделать это.Тем не менее, вы можете создать коллекцию списка файлов для чтения, а затем попросить спарк прочитать только эти файлы.

Этот блог может быть полезен для вашей ситуации.

0 голосов
/ 01 декабря 2018

Вы можете использовать подстановочные знаки в вашем пути для загрузки только файлов в заданном диапазоне.

spark.read.parquet('s3://my_bucket/my_schema/my_table_directory/07-{01,02,03}-2018-*/')

или

spark.read.parquet('s3://my_bucket/my_schema/my_table_directory/07-*-2018-*/')
0 голосов
/ 30 ноября 2018

То, что вы говорите, может быть правдой, но оно неэффективно, поскольку никогда не будет масштабироваться.Если вам нужны данные за три месяца, вы не можете указать 90 строк кода в вашей команде загрузки.Это просто не очень хорошая идея, когда дело доходит до больших данных.Вы всегда можете выполнить операции с таким большим набором данных, используя отдельный искр или кластер YARN.

...