Spark-scala如何使用HDFS目录分区

时间:2016-06-18 22:46:24

标签: scala hadoop apache-spark hdfs

为了缩短处理时间,我按日期对数据进行了分区,这样我就只使用了所需的日期数据(不是完整的表格)。现在在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中选择所需的分区或日期文件夹?完成过程后,我也需要覆盖相同的日期目录。

有关流程的详细信息: 我想从源表和目标表中选择正确的数据窗口(如不需要的所有其他日期数据)。然后我想要加入 - >超前/滞后 - >联盟 - >写。

1 个答案:

答案 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/lagjoin。然后他建议 - 从严格的性能角度 - 避免使用Spark SQL并手动执行操作。

OP:我现在唯一可以建议的是检查

preservesPartitioning=true
在您的RDD操作中设置了

。但我甚至不确定Spark是否为lag/lead公开了这种能力:请检查。