2016-11-30 7 views
1

Представьте У меня есть большой файл журнала формата:фильтр эффективно упорядоченный файл с искрой

Timestamp, text 
Timestamp, text 
Timestamp, text 
Timestamp, text 
Timestamp, text 
Timestamp, text 

Файл журнала уже заказанный метку времени. Если я прочитал файл с искрой в качестве фрейма данных, а затем отфильтровать временную метку между t1 и t2, Затем он проверяет каждую запись, если метка времени находится между t1 и t2, что занимает много времени.

Однако, есть ли способ, которым я могу сказать искру, что df уже заказан, тогда он знал бы, что просто нужно искать первую и последнюю временную метку и возвращать все линии между ними, что было бы намного быстрее?

+1

идеальное решение было бы разметить вход файлы по вашей «Timestamp», а затем читать только файлы, которые вы действительно хотите. Spark поддерживает предикат pushdown, поэтому, если вы сделали 'spark.read.parquet (myParquet.parq) .filter (...)', он позаботился бы только о чтении соответствующих файлов для вас. –

ответ

3

Нет, такого варианта в искре нет. Но существует другое решение, широко используемое в системах, в которых хранятся события или журналы, называемые разделением. Если у вас есть записи из многих дней, добавить новый столбец только день:

df.withColumn("day", df.timestamp.cast("date")) 

затем сохранить этот файл, используя partitionedBy:

df_with_day.write.partitionBy("day").csv("partitioned") 

Это будет создавать каталоги на каждый день (и колонок день не будет быть сохранены в файлах переписаны), поэтому следующий запрос с соответствующим where фильтрации будет ommit файлов из каталогов, которые не находятся в диапазоне:

new_df = spark.read.csv("partitioned") 
new_df.where(new.day.between("2016-11-30", "2016-12-10")).show()