将Spark RDD中的Parquet文件写入动态文件夹

时间:2016-02-08 07:58:49

标签: scala apache-spark rdd parquet

给出以下代码段(Spark版本:1.5.2):

rdd.toDF().write.mode(SaveMode.Append).parquet(pathToStorage)

将RDD数据保存到拼合的Parquet文件中,我希望我的存储有如下结构:

country/
    year/
        yearmonth/
            yearmonthday/

数据本身包含国家/地区列和时间戳1,因此我从this method开始。但是,由于我的数据中只有一个时间戳,因此我不能按年/年/年/月日对整个事物进行分区,因为这些不是列本身...

而且this solution似乎很不错,除非我无法将其改编为Parquet文件......

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我明白了。为了使路径动态链接到RDD,首先必须从rdd创建一个元组:

rdd.map(model => (model.country, model))

然后,所有记录都必须被解析,以检索不同的国家:

val countries = rdd.map {
        case (country, model) => country
    }
    .distinct()
    .collect()

现在已知这些国家,记录可以根据其不同的国家来编写:

countries.map {
    country => {
        val countryRDD = rdd.filter {
                case (c, model) => c == country
            }
            .map(_._2)
        countryRDD.toDF().write.parquet(pathToStorage + "/" + country)
    }
} 

当然,整个集合必须解析两次,但这是我到目前为止找到的唯一解决方案。

关于时间戳,您只需要使用3元组进行相同的处理(第三个类似于20160214);我最后选择了当前的时间戳。