spark根据key输出到多个目录
来源:互联网 发布:itunes12怎么下载软件 编辑:程序博客网 时间:2024/05/29 13:19
项目中需要将spark的输出按id输出到不同的目录中,即实现在spark中的多路输出。我们可以调用saveAsHadoopFile函数并自定义一个OutputFormat类,就可以达到上述目的。
import org.apache.commons.lang3.StringUtilsimport org.apache.hadoop.fs.{FileSystem, Path}import org.apache.hadoop.mapred.lib.MultipleTextOutputFormatimport org.apache.spark.{SparkConf, SparkContext}/** * Created by WangLei on 17-6-2. */object genSpecifiedUserData { val inputPath = "xxx" def genData(sc:SparkContext) = { sc.textFile(inputPath) .filter(x => StringUtils.split(x, "\t").length == 7) .map(x => { val lines = StringUtils.split(x, "\t") val (id, aid, title, desc) = (lines(0), lines(1), lines(5), lines(6)) (id, aid, title, desc) }) .filter(x => StringUtils.isNotBlank(x._1)) .map(x => { val (id, aid, title, desc) = (x._1, x._2, x._3, x._4) val pattern = Array(aid, title, desc).mkString("\t") (id, pattern) }) .partitionBy(new org.apache.spark.HashPartitioner(10)) } def main(args: Array[String]): Unit = { val sparkConf = new SparkConf().setAppName("gen_specified_user_data") sparkConf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer") val sc = new SparkContext(sparkConf) val output = "/data/xxx/specified/" val fileSystem = FileSystem.get(sc.hadoopConfiguration) fileSystem.delete(new Path(output), true) findSpecifiedUser(sc).saveAsHadoopFile( output, classOf[String], classOf[String], classOf[RDDMultipleTextOutputFormat[_, _]]) sc.stop() }}class RDDMultipleTextOutputFormat[K, V]() extends MultipleTextOutputFormat[K, V]() { override def generateFileNameForKeyValue(key: K, value: V, name: String) : String = { (key + "/" + name) }}
其中,输入的数据是以”\t”分隔一共七列,第一列为用户id。我们希望将输出的时候,相同的用户id输出到同一个目录下面,不同的用户id分开。
RDDMultipleTextOutputFormat类中的generateFileNameForKeyValue函数有三个参数,key和value就是我们RDD的Key和Value,而name参数是每个Reduce的编号。上面的代码中没有使用该参数,而是直接将同一个Key的数据输出到同一个文件中。
最后生成的结果在HDFS上为:
/data/xxx/specified/idA/.../data/xxx/specified/idB/.../data/xxx/specified/idC/...
阅读全文
0 0
- spark根据key输出到多个目录
- spark 多目录输出
- Spark根据key,按照一定条件对数据去重
- spark rdd根据key保存进不同的文件夹
- 自定义根据某个目录输出Log日志
- Map根据Valuse 输出对应的key(一)
- Map根据Valuse 输出对应的key(二)
- Spark中sortByKey和sortBy对(key,value)数据分别 根据key和value排序
- Spark中sortByKey和sortBy对(key,value)数据分别 根据key和value排序
- Map中根据value排序---输出value最大时所对应的Key
- Spark PG3. RDD 操作一 基础 ,放入方法,闭包,输出元素, 使用 Key-Value 工作
- HashMap 根据key排序
- php根据key值去重
- 输出目录
- Pythontip 输出字典key
- 根据传递的目录名,文件名参数转换输出外部访问的URL地址
- MapReduce 编程 系列八 根据输入路径产生输出路径和清除HDFS目录
- HashMap 根据Value获取Key
- C语言实现单链表面试题——基础篇(上)
- [bzoj]1015: [JSOI2008]星球大战starwar
- 表格超过限制自动换行或隐藏省略
- python爬取大众点评网商家信息以及评价,并将数据存储到excel表中(源码及注释)
- javascript格式化数字问题(1234567890 --> 1,234,567,890)
- spark根据key输出到多个目录
- AndroidSudio打开工程报错: could not reserve enough space for object heap
- yolov2-cpu检测90ms每帧之tinier模型(3.5M)应用
- 文章标题
- 谈谈ARC下的内存管理
- 51nod 1459 迷宫游戏
- java基础【03】 拷贝
- sql执行顺序
- mysql5.7 系统学习前沿