将 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 写入动态文件夹的主要内容,如果未能解决你的问题,请参考以下文章
Spark SQL - 如何将 DataFrame 写入文本文件?
处理存储在 RDD [String] 中的记录时,spark collect 方法花费了太多时间