将 Parquet 文件从 Spark RDD 写入动态文件夹

Posted

技术标签:

【中文标题】将 Parquet 文件从 Spark RDD 写入动态文件夹【英文标题】:Write Parquet files from Spark RDD to dynamic folders 【发布时间】:2016-02-08 07:58:49 【问题描述】:

鉴于以下 sn-p(Spark 版本:1.5.2):

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

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

country/
    year/
        yearmonth/
            yearmonthday/

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

this solution 看起来还不错,只是我无法使其适应 Parquet 文件...

有什么想法吗?

【问题讨论】:

【参考方案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);我最终选择了当前时间戳。

【讨论】:

以上是关于将 Parquet 文件从 Spark RDD 写入动态文件夹的主要内容,如果未能解决你的问题,请参考以下文章

过滤计数等于输入文件 rdd Spark 的列

Spark SQL - 如何将 DataFrame 写入文本文件?

处理存储在 RDD [String] 中的记录时,spark collect 方法花费了太多时间

Spark SQL讲解

将具有无效字符的嵌套字段从 Spark 2 导出到 Parquet [重复]

将rdd保存到镶木地板文件scala