Apache spark foreachRDD操作后将RDD转换为数据帧
我正在处理使用Spark流的日志。我解析日志并将日志转换为Java映射。下面是代码。 现在我想把这个映射转换成数据帧 有什么建议如何实现这一目标Apache spark foreachRDD操作后将RDD转换为数据帧,apache-spark,spark-streaming,Apache Spark,Spark Streaming,我正在处理使用Spark流的日志。我解析日志并将日志转换为Java映射。下面是代码。 现在我想把这个映射转换成数据帧 有什么建议如何实现这一目标 val sparkConf = new SparkConf().setAppName("StreamingApp").setMaster("local[2]") sc = new SparkContext(sparkConf) val ssc = new StreamingContext(sc, Seconds(2)) sqlContext= new
val sparkConf = new SparkConf().setAppName("StreamingApp").setMaster("local[2]")
sc = new SparkContext(sparkConf)
val ssc = new StreamingContext(sc, Seconds(2))
sqlContext= new SQLContext(sc)
val lines = ssc.textFileStream("hdfs://localhost:9000/test")
process(lines)
def process(lines: DStream[String]) {
val maptorow = lines.foreachRDD(rdd=>{
rdd.map(line => getMap(line))
.map(p =>
Row(p.get("column1"),
p.get("column2"))
}) // how to get dataframe after this?
def getMap(logs: String): java.util.Map[String, Object] = {
val k : java.util.Map[String, String] = parseLog(logs)
}
}
感谢foreachRDD没有返回类型,因此,您不应该保存maptorow,为了转换它,您需要在foreachRDD内部进行转换,然后将每个RDD作为单独的数据集单独处理
val sqlContext = new SQLContext(sparkContext)
lines.foreachRDD(rdd=>{
import sqlContext.implicits._
val maptorow = lines.foreachRDD(rdd=>{
val newRDD = rdd.map(line => getMap(line))
.map(p =>
Row(p.get("column1"),
p.get("column2"))
val myDataFrame = newRDD.toDF()
//process myDataFrame as a DF
})
很抱歉,我没有真正理解您的问题。如何在spark streaming中过滤数据流?
rdd.filter(谓词)
或dstream.filter(谓词)
?但是我的代码中的maptorow val没有转换为DataFrameThank。但是当我尝试此操作时,我得到了编译错误“value toDF不是org.apache.spark.rdd.rdd[org.apache.spark.sql.Row]的成员”@Alok my bad,implicits应该导入到foreach循环中。请参见上文,抱歉,它仍然给出了相同的错误。尽管sqlContext.createDataFrame(newRDD,schema)对我有效。谢谢