spark 批量读取HDFS(hive分区)parquet文件

情况说明:数据以parquet文件形式保存在HDFS上,数据中的某一列包含了日期(例如:2017-12-12)属性,根据日期对数据分区存储,如下图所示:

项目需求:
在项目中想要读取某一个月的数据,肿么办?
解决方法:
spark中读取本地文件的方法如下:

sparkSession.read.parquet("hdfs://path")
1
方法一:
要读取多个文件,文件的路径中有一段公共路径。这样,首先想到的方法就是通过通配符来读取多个文件,对应的代码如下:

sparkSession.read.parquet("hdfs://hzgc:9000/user/hive/warehouse/person_table/date=2017-12-*")

理想是美好的,但是现实是残酷的,代码运行结果报错:

也就是说文件是查找到了,但是读取的方式是不对的,那怎么办呢?好在spark足够人性化,在后面给出了提示:

If provided paths are partition directories, please set "basePath" in the options of the data source to specify the root directory of the table. If there are multiple root directories, please load them separately and then union them.
1
什么意思呢?翻译过来就是:如果提供的路径是分区路径,那么请在数据源的option中设置“basePath”来单独指定表的根路径;如果根路径不同,那么就分别加载数据,然后采用union的方式加数据合并。

方法二:
于是修改代码如下:

sparkSession.read.option("basePath", basePath).parquet(basePath + "date=2017-12-*")
1
运行结果没毛病,老铁!

方法三:

sparkSession.read.parquet("hdfs://hzgc:9000/user/hive/warehouse/person_table/date=2017-12-13")   .union(sparkSession.read.parquet("hdfs://hzgc:9000/user/hive/warehouse/person_table/date=2017-12-09"))  .union(sparkSession.read.parquet("hdfs://hzgc:9000/user/hive/warehouse/person_table/date=2017-12-07"))       .union(sparkSession.read.parquet("hdfs://hzgc:9000/user/hive/warehouse/person_table/date=2017-12-08"))
1
这样也没有问题,但是想想还是方法二更方便一些!

方法四:

sparkSession.read.parquet("url","url2",..."urlN")
1
这个有点类似于暴力方法,也就是在路径参数中将你需要读取的所有文件的路径依次加进去,中间用“,”分割。

如果你非要采用方法四这中办法,其实也是有改进的方法的。主要在于这个路径怎么获取,肯定不能每查一次自己手动去修改一次,那么就可以通过hadoop API在获取指定路径下的文件,然后将该路径下的所有文件路径加入到一个数组或者列表中。具体方法可以问度娘,实现不难。
————————————————
版权声明:本文为CSDN博主「~shallot~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/dylanzr/article/details/78834537

你可能感兴趣的:(spark)