我是Spark的新手,我想制作流媒体节目。我需要预测每行的重复次数。这是我的原始数据:
05:49:56.604899 00:00:00:00:00:02 > 00:00:00:00:00:03, ethertype IPv4 (0x0800), length 10202: 10.0.0.2.54880 > 10.0.0.3.5001: Flags [.], seq 3641977583:3641987719, ack 129899328, win 58, options [nop,nop,TS val 432623 ecr 432619], length 10136
05:49:56.604908 00:00:00:00:00:03 > 00:00:00:00:00:02, ethertype IPv4 (0x0800), length 66: 10.0.0.3.5001 > 10.0.0.2.54880: Flags [.], ack 10136, win 153, options [nop,nop,TS val 432623 ecr 432623], length 0
05:49:56.604900 00:00:00:00:00:02 > 00:00:00:00:00:03, ethertype IPv4 (0x0800), length 4410: 10.0.0.2.54880 > 10.0.0.3.5001: Flags [P.], seq 10136:14480, ack 1, win 58, options [nop,nop,TS val 432623 ecr 432619], length 4344
我写了一个代码,提取我的合适输出,如下所示。 (我需要在column1和column2上重复的次数)
这是我的代码:
但是我的代码不是流式传输模式。我做了另一个代码来获得流模式。因为train.csv文件是以流方式生成的。但是我遇到了一些错误。 这是我的流媒体代码:
import org.apache.spark.SparkConf
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.regression.{LabeledPoint, StreamingLinearRegressionWithSGD}
import org.apache.spark.sql.Row
import org.apache.spark.sql.types.{StringType, StructField, StructType}
import org.apache.spark.streaming.{Seconds, StreamingContext}
import scala.util.Try
/**
* Created by saeedtkh on 5/24/17.
*/
object Main_ML_with_Streaming {
def main(args: Array[String]) {
val conf = new SparkConf().setAppName("saeed_test").setMaster("local[*]")
//val sc = new SparkContext(conf)
val ssc = new StreamingContext(conf, Seconds(5))
/////////////////////Start extract the packet
val customSchema = StructType(Array(
StructField("column0", StringType, true),
StructField("column1", StringType, true),
StructField("column2", StringType, true)))
val rdd = ssc.textFileStream("/Users/saeedtkh/Desktop/sharedsaeed/train.csv")
val rowRdd =rdd.map(line => line.split(">")).map(array => {
val first = Try(array(0).trim.split(" ")(0)) getOrElse ""
val second = Try(array(1).trim.split(" ")(6)) getOrElse ""
val third = Try(array(2).trim.split(" ")(0).replace(":", "")) getOrElse ""
Row.fromSeq(Seq(first, second, third))
})
val dataFrame_trainingData = sqlContext.createDataFrame(rowRdd, customSchema)
dataFrame_trainingData.groupBy("column1","column2").count().show()
/////////////////////end extract the packet
val testData = ssc.textFileStream(/Users/saeedtkh/Desktop/sharedsaeed/test.csv).map(LabeledPoint.parse)
////////////////////end trainging and testing
val numFeatures = 3
val model = new StreamingLinearRegressionWithSGD()
.setInitialWeights(Vectors.zeros(numFeatures))
model.trainOn(dataFrame_trainingData)
model.predictOnValues(testData.map(lp => (lp.label, lp.features))).print()
ssc.start()
ssc.awaitTermination()
print("Here is the anwser: *****########*********#########*******222")
}
}
问题在于,我无法在我的代码中使用sqlcontext创建数据框:
val dataFrame_trainingData = sqlContext.createDataFrame(rowRdd, customSchema)
任何正文都可以帮我修改这个以流方式工作的代码,并使用线性回归或任何其他算法预测每行的重复。非常感谢。
答案 0 :(得分:0)
首先,请务必注意ssc.textFileStream
返回DStream
而不是RDD
,因此您命名为rdd
,rowRdd
和{{的变量1}}不是真正的RDD,而是连续RDD序列的抽象。因此,您无法将这些传递给期望RDD的testData
。
您可以使用createDataFrame
从每个基础RDD中创建一个DataFrame,如上所述here:
DStream.foreachRDD
但是,您应该注意到StreamingLinearRegressionWithSGD
期望DStreams作为rowRdd.foreachRDD { rdd =>
val dataFrame_trainingData = sqlContext.createDataFrame(rdd, customSchema)
// ...
}
和trainOn
的输入 - 因此您只需传递原始DStream而不将其转换为DataFrame。