Apache spark foreachRDD操作后将RDD转换为数据帧

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

我正在处理使用Spark流的日志。我解析日志并将日志转换为Java映射。下面是代码。 现在我想把这个映射转换成数据帧 有什么建议如何实现这一目标

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)对我有效。谢谢