想象一下,我有一个格式的大日志文件:
Timestamp, text
Timestamp, text
Timestamp, text
Timestamp, text
Timestamp, text
Timestamp, text
日志文件已按时间戳排序。 如果我使用spark作为数据帧读取文件,然后在t1和t2之间的时间戳上进行过滤, 然后,如果时间戳在t1和t2之间,他会检查每条记录,这需要花费很多时间。
然而,有没有一种方法可以告诉我已经订购了df的火花,然后它会知道它只需要查找第一个和最后一个时间戳,并返回其间的所有行,这将是一个快得多?
答案 0 :(得分:3)
不,火花中没有这样的选择。但是有不同的解决方案,广泛用于存储事件或称为分区的日志的系统中。如果您有多天的记录,请添加仅包含一天的新列:
Stream<Character>
然后使用partitionedBy保存此文件:
df.withColumn("day", df.timestamp.cast("date"))
这将为每天创建目录(并且列日不会保存在重写文件中),因此具有适当df_with_day.write.partitionBy("day").csv("partitioned")
过滤的下一个查询将忽略不在范围内的目录中的文件:
where