使用模式匹配在Spark中读取镶木地板文件

时间:2016-08-16 16:25:24

标签: apache-spark parquet

我正在运行Spark 1.3.0并希望根据模式匹配读取大量的镶木地板文件。镶木地板文件基本上是Hive DB的底层文件,我只想读取一些文件(跨越不同的文件夹)。文件夹结构是

def clean(self):
    cleaned_data = super(NewAccountForm, self).clean()

    password = cleaned_data.get('password')
    password_confirm = cleaned_data.get('password_confirm ')

    if password and password_confirm:
        if password != password_confirm:
            raise forms.ValidationError("The two password fields must match.")
    return cleaned_data

这样的东西
hdfs://myhost:8020/user/hive/warehouse/db/blogs/some/meta/files/
hdfs://myhost:8020/user/hive/warehouse/db/blogs/yymmdd=20160101/01/file1.parq         
hdfs://myhost:8020/user/hive/warehouse/db/blogs/yymmdd=20160101/02/file2.parq
hdfs://myhost:8020/user/hive/warehouse/db/blogs/yymmdd=20160103/01/file3.parq

我想忽略元文件并仅加载日期文件夹中的镶木地板文件。这可能吗?

1 个答案:

答案 0 :(得分:0)

你可以在镶木地板上使用通配符,因此(1.5上的工作没有在1.3上测试):

val v1 = sqlContext.parquetFile("hdfs://myhost:8020/user/hive/warehouse/db/blogs/yymmdd*")

如果不起作用,你可以做的另一件事是使用带yymmdd分区的hive创建外部表,并使用以下方法从该表读取镶木地板:

val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc)
sqlContext.sql("SELECT FROM ...")

你不能使用正则表达式。

我认为你的文件夹结构也有问题。它应该是 HDFS://为myhost:8020 /用户/蜂巢/仓库/分贝/博客/ YYMMDD = 150204 / 要么 HDFS://为myhost:8020 /用户/蜂巢/仓库/分贝/博客/ YYMMDD = 150204 /部分= 01 并不是: HDFS://为myhost:8020 /用户/蜂巢/仓库/分贝/博客/ YYMMDD =一分之一十五万零二百零四

因为他们使用它的方式我觉得使用文件夹名称(yymmdd)作为分区会有麻烦,因为文件不在它下面