为了缩短处理时间,我按日期对数据进行了分区,这样我就只使用了所需的日期数据(不是完整的表格)。现在在HDFS中,我的表格存储如下
src_tbl //main dir trg_tbl
2016-01-01 //sub dir 2015-12-30
2016-01-02 2015-12-31
2016-01-03 2016-01-01
2016-01-03
现在我要选择min(date) from src_tbl
2016-01-01
并且从trg_tb
l我想使用> = 2016-01-01 (src_tbl min(date)) directories which will be
2016-01-01和2016-01-03数据中的数据
如何使用Spark-scala从hdfs中选择所需的分区或日期文件夹?完成过程后,我也需要覆盖相同的日期目录。
有关流程的详细信息: 我想从源表和目标表中选择正确的数据窗口(如不需要的所有其他日期数据)。然后我想要加入 - >超前/滞后 - >联盟 - >写。
答案 0 :(得分:2)
Spark SQL(包括DataFrame / set api)在处理分区表时非常有趣,它将现有的分区信息从一个转换/阶段保留到下一个转换/阶段。
对于初始加载,Spark SQL倾向于在理解如何保留底层分区信息方面做得很好 - if 这些信息以hive metastore metadata
的形式提供给表
那么......这些是hive
表吗?
如果是这样 - 到目前为止很好 - 您应该根据hive
分区按分区看到数据加载分区。
DataFrame / Dataset 会记住这个漂亮的分区吗? 设置?
现在事情变得有点棘手了。答案取决于是否需要shuffle
。
在您的情况下 - 一个简单的filter
操作 - 不应该有任何需要。所以再一次 - 你应该看到保留原始分区,从而获得良好的性能。请确认分区确实已保留。
我将提到,如果调用了任何aggregate
函数,那么可以确保您的分区将丢失。在这种情况下,Spark SQL将使用HashPartitioner
- 引导完整的随机播放。
更新 OP在此处提供了更多详细信息:涉及lead/lag
和join
。然后他建议 - 从严格的性能角度 - 避免使用Spark SQL并手动执行操作。
OP:我现在唯一可以建议的是检查
preservesPartitioning=true
在您的RDD操作中设置了。但我甚至不确定Spark是否为lag/lead
公开了这种能力:请检查。