关于rdd写入hdfs数据

wjw870907 2017-12-07 04:43:15
代码如下
def processRdd(rdd: RDD[(String, String)]): Unit = {
val dateformat = new SimpleDateFormat("yyyyMMdd")
val cal = Calendar.getInstance
cal.add(Calendar.DATE, -1)
val today = dateformat.format(new Date())
val yesterday = dateformat.format(cal.getTime)
val lines = rdd.map(_._2)
val words = lines.flatMap(_.split("\n"))
words.foreach(word => {
val EndTime = JSON.parseObject(word).getJSONArray("SHEET").getJSONObject(0).getJSONObject("HEADER").getLong("ENDTIME").toString.substring(0, 8)
if (EndTime != today && EndTime != yesterday) {
//println(EndTime)
words.saveAsTextFile("hdfs://tmp/" + EndTime + "/error")
}
else {
words.saveAsTextFile("hdfs://tmp/" + EndTime)
//println(EndTime)
}
})
}
作用就是消费kafka里的json数据,取值做比对,然后写到hdfs目录里,运行时提示rdd里不能嵌套rdd,本人新手,不知道怎么写
...全文
1653 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
wjw870907 2017-12-12
  • 打赏
  • 举报
回复
不行的,json解析的对象是一个string,lines是rdd,数据不大我做了一次collect lines.map(line => { //取时间和数据 val ObjData = jsonParser(line) //取时间值 (ObjData, line) })//.groupByKey().mapValues(_.toSeq.toList).collect().foreach(ele =>{ .groupBy(x=>x._1).mapValues(_.map(_._2).toSet.toList).collect().foreach(ele =>{ val date = ele._1 val data = ele._2 if (date == today || date == yesterday){ ssc.sparkContext.parallelize(data).saveAsTextFile("hdfs://tmp/" + today + "/error" + date) } else{ ssc.sparkContext.parallelize(data).saveAsTextFile("hdfs://tmp/" + today + "/error" + date) } }) 但是这样我发现在hdfs里数据是被覆盖的
Zzreal 2017-12-09
  • 打赏
  • 举报
回复
引用 2 楼 wjw870907 的回复:
[quote=引用 1 楼 Zonzereal 的回复:] 搞不懂你为什么要定义那么多变量,rdd的转换算子可以一直点下去,比如val lines = rdd.map(_._2).flatMap(_.split("\n")).foreach(println)这样,不用重新定义变量,浪费内存不说还需要对每个rdd进行cache()操作,否则每个action算子都会触发rdd的计算 编码习惯一点都不好 而且代码贴一半,报错信息也没有,怎么帮你解决问题
引用 1 楼 Zonzereal 的回复:
搞不懂你为什么要定义那么多变量,rdd的转换算子可以一直点下去,比如val lines = rdd.map(_._2).flatMap(_.split("\n")).foreach(println)这样,不用重新定义变量,浪费内存不说还需要对每个rdd进行cache()操作,否则每个action算子都会触发rdd的计算 编码习惯一点都不好 而且代码贴一半,报错信息也没有,怎么帮你解决问题
package spark import kafka.serializer.StringDecoder import org.apache.log4j.{Level, Logger} import org.apache.spark.SparkConf import org.apache.spark.rdd._ import org.apache.spark.streaming.kafka._ import org.apache.spark.streaming.{Seconds, StreamingContext} import java.text.SimpleDateFormat import java.util.{Calendar, Date} import com.alibaba.fastjson.JSON object streaming { /* def json(time:String):String={ val dateformat = new SimpleDateFormat("yyyyMMdd") val cal = Calendar.getInstance cal.add(Calendar.DATE, -1) val today = dateformat.format(new Date()) val yesterday = dateformat.format(cal.getTime) val jsonstr = JSON.parseObject(time) val EndTime = jsonstr.getJSONArray("SHEET").getJSONObject(0).getJSONObject("HEADER").getLong("ENDTIME").toString.substring(0,8) if (EndTime == today && EndTime == yesterday){ EndTime } else{ EndTime } }*/ def processRdd(rdd: RDD[(String, String)]): Unit = { val dateformat = new SimpleDateFormat("yyyyMMdd") val cal = Calendar.getInstance cal.add(Calendar.DATE, -1) val today = dateformat.format(new Date()) val yesterday = dateformat.format(cal.getTime) val lines = rdd.map(_._2) lines.foreach(word => { val jsonstr = JSON.parseObject(word) val EndTime = jsonstr.getJSONArray("SHEET").getJSONObject(0).getJSONObject("HEADER").getLong("ENDTIME").toString.substring(0, 8) if (EndTime != today && EndTime != yesterday) { lines.saveAsTextFile("hdfs://tmp/" + today + "/error" + EndTime) } else { lines.saveAsTextFile("hdfs://tmp/" + EndTime) //println(EndTime) } }) } def main(args: Array[String]): Unit = { Logger.getLogger("org").setLevel(Level.ERROR) val sparkConf = new SparkConf().setAppName("ticket").setMaster("local").set("spark.executor.memory", "1g") .set("spark.streaming.stopGracefullyOnShutdown", "true") val ssc = new StreamingContext(sparkConf, Seconds(2)) //ssc.checkpoint("checkpoint") val topics = Set("bms133") val brokers = "10.0.0.10:9092" val groupId = "streaming" val kafkaParams = Map[String, String]( "metadata.broker.list" -> brokers, "group.id" -> groupId, "auto.offset.reset" -> "largest" ) val lines = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](ssc, kafkaParams, topics) lines.foreachRDD(rdd => { if (!rdd.isEmpty()) { processRdd(rdd) } }) ssc.start() ssc.awaitTermination() } } 全部代码在这里,报错信息是org.apache.spark.SparkException: RDD transformations and actions can only be invoked by the driver, not inside of other transformations; for example, rdd1.map(x => rdd2.values.count() * x) is invalid because the values transformation and count action cannot be performed inside of the rdd1.map transformation. For more information, see SPARK-5063. 新手,不太会写[/quote] lines的foreach操作和saveAsTextFile操作action嵌套了, 直接把lines进行cache,然后把foreach去掉应该可以。写算子操作的时候弄清楚你的返回值是什么 val lines = rdd.map(_._2).cache() val jsonstr = JSON.parseObject(lines) val EndTime = jsonstr.getJSONArray("SHEET").getJSONObject(0).getJSONObject("HEADER").getLong("ENDTIME").toString.substring(0, 8) if (EndTime != today && EndTime != yesterday) { lines.saveAsTextFile("hdfs://tmp/" + today + "/error" + EndTime) } else { lines.saveAsTextFile("hdfs://tmp/" + EndTime) //println(EndTime) } 应该可以
wjw870907 2017-12-08
  • 打赏
  • 举报
回复
引用 1 楼 Zonzereal 的回复:
搞不懂你为什么要定义那么多变量,rdd的转换算子可以一直点下去,比如val lines = rdd.map(_._2).flatMap(_.split("\n")).foreach(println)这样,不用重新定义变量,浪费内存不说还需要对每个rdd进行cache()操作,否则每个action算子都会触发rdd的计算 编码习惯一点都不好 而且代码贴一半,报错信息也没有,怎么帮你解决问题
引用 1 楼 Zonzereal 的回复:
搞不懂你为什么要定义那么多变量,rdd的转换算子可以一直点下去,比如val lines = rdd.map(_._2).flatMap(_.split("\n")).foreach(println)这样,不用重新定义变量,浪费内存不说还需要对每个rdd进行cache()操作,否则每个action算子都会触发rdd的计算 编码习惯一点都不好 而且代码贴一半,报错信息也没有,怎么帮你解决问题
package spark import kafka.serializer.StringDecoder import org.apache.log4j.{Level, Logger} import org.apache.spark.SparkConf import org.apache.spark.rdd._ import org.apache.spark.streaming.kafka._ import org.apache.spark.streaming.{Seconds, StreamingContext} import java.text.SimpleDateFormat import java.util.{Calendar, Date} import com.alibaba.fastjson.JSON object streaming { /* def json(time:String):String={ val dateformat = new SimpleDateFormat("yyyyMMdd") val cal = Calendar.getInstance cal.add(Calendar.DATE, -1) val today = dateformat.format(new Date()) val yesterday = dateformat.format(cal.getTime) val jsonstr = JSON.parseObject(time) val EndTime = jsonstr.getJSONArray("SHEET").getJSONObject(0).getJSONObject("HEADER").getLong("ENDTIME").toString.substring(0,8) if (EndTime == today && EndTime == yesterday){ EndTime } else{ EndTime } }*/ def processRdd(rdd: RDD[(String, String)]): Unit = { val dateformat = new SimpleDateFormat("yyyyMMdd") val cal = Calendar.getInstance cal.add(Calendar.DATE, -1) val today = dateformat.format(new Date()) val yesterday = dateformat.format(cal.getTime) val lines = rdd.map(_._2) lines.foreach(word => { val jsonstr = JSON.parseObject(word) val EndTime = jsonstr.getJSONArray("SHEET").getJSONObject(0).getJSONObject("HEADER").getLong("ENDTIME").toString.substring(0, 8) if (EndTime != today && EndTime != yesterday) { lines.saveAsTextFile("hdfs://tmp/" + today + "/error" + EndTime) } else { lines.saveAsTextFile("hdfs://tmp/" + EndTime) //println(EndTime) } }) } def main(args: Array[String]): Unit = { Logger.getLogger("org").setLevel(Level.ERROR) val sparkConf = new SparkConf().setAppName("ticket").setMaster("local").set("spark.executor.memory", "1g") .set("spark.streaming.stopGracefullyOnShutdown", "true") val ssc = new StreamingContext(sparkConf, Seconds(2)) //ssc.checkpoint("checkpoint") val topics = Set("bms133") val brokers = "10.0.0.10:9092" val groupId = "streaming" val kafkaParams = Map[String, String]( "metadata.broker.list" -> brokers, "group.id" -> groupId, "auto.offset.reset" -> "largest" ) val lines = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](ssc, kafkaParams, topics) lines.foreachRDD(rdd => { if (!rdd.isEmpty()) { processRdd(rdd) } }) ssc.start() ssc.awaitTermination() } } 全部代码在这里,报错信息是org.apache.spark.SparkException: RDD transformations and actions can only be invoked by the driver, not inside of other transformations; for example, rdd1.map(x => rdd2.values.count() * x) is invalid because the values transformation and count action cannot be performed inside of the rdd1.map transformation. For more information, see SPARK-5063. 新手,不太会写
Zzreal 2017-12-07
  • 打赏
  • 举报
回复
搞不懂你为什么要定义那么多变量,rdd的转换算子可以一直点下去,比如val lines = rdd.map(_._2).flatMap(_.split("\n")).foreach(println)这样,不用重新定义变量,浪费内存不说还需要对每个rdd进行cache()操作,否则每个action算子都会触发rdd的计算 编码习惯一点都不好 而且代码贴一半,报错信息也没有,怎么帮你解决问题

1,258

社区成员

发帖
与我相关
我的任务
社区描述
Spark由Scala写成,是UC Berkeley AMP lab所开源的类Hadoop MapReduce的通用的并行计算框架,Spark基于MapReduce算法实现的分布式计算。
社区管理员
  • Spark
  • shiter
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧