给出以下代码段(Spark版本:1.5.2):
rdd.toDF().write.mode(SaveMode.Append).parquet(pathToStorage)
将RDD数据保存到拼合的Parquet文件中,我希望我的存储有如下结构:
country/
year/
yearmonth/
yearmonthday/
数据本身包含国家/地区列和时间戳1,因此我从this method开始。但是,由于我的数据中只有一个时间戳,因此我不能按年/年/年/月日对整个事物进行分区,因为这些不是列本身...
而且this solution似乎很不错,除非我无法将其改编为Parquet文件......
有什么想法吗?
答案 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
);我最后选择了当前的时间戳。