spark streaming向RDD和DataFrame转换

Data streaming转为DataFrame,不能直接一步转到DF,需要先转为RDD,然后再转到DF,我们用流式处理数据后,再通过spark sql实时获取我们想要的结果。

1.首先老规矩,创建spark上下文对象,spark SQL和spark Streaming,再创建个socket在Linux端打入数据。

1 val conf = new SparkConf().setAppName("Demo04DSToRDDToDF").setMaster("local[2]")
2 
3     conf.set("spark.sql.shuffle.partitions", "1")
4     val sc = new SparkContext(conf)
5     val sqlContext = new SQLContext(sc)
6 
7     val ssc = new StreamingContext(sc,Durations.seconds(5))
8 
9     val lines = ssc.socketTextStream("master",8888)

2.首先用foreachRDD方法把spark streaming转为RDD

 1     /**
 2       *
 3       * DS  -> RDD -> DF
 4       *
 5       */
 6     lines.foreachRDD(rdd => {
 7      val stuRDD = rdd.map(line => {
 8         val split = line.split(",")
 9        (split(0),split(1),split(2).toInt,split(3),split(4))
10       })

3.导入sqlContext隐式转换,将RDD To成DF,同时传入column对应RDD返回值

 1       //导入隐式转换,将RDD转换为DF
 2       import sqlContext.implicits._
 3 
 4       val stuDF = stuRDD.toDF("id","name","age","gender","clazz")
 5       //注册成表
 6       stuDF.registerTempTable("student")
 7 
 8       val result = sqlContext.sql("select clazz,count(1) from student group by clazz")
 9 
10       result.show()
11       result.write.mode(SaveMode.Append).json("Spark/data/dsondf")

总结,这里的sqlContext必须自己创建好,原来我还以为是导包的时候,类都已经封装好了的,直接import就行了,报的数组下标越界,懵了半天。

posted @ 2020-06-10 22:08  会飞的猪、li  阅读(1343)  评论(0编辑  收藏  举报