[英]use SQL in DStream.transform() over Spark Streaming?
在foreachRDD()
有一些在Spark Streaming上使用SQL的示例。 但是,如果我想在tranform()
使用SQL:
case class AlertMsg(host:String, count:Int, sum:Double)
val lines = ssc.socketTextStream("localhost", 8888)
lines.transform( rdd => {
if (rdd.count > 0) {
val t = sqc.jsonRDD(rdd)
t.registerTempTable("logstash")
val sqlreport = sqc.sql("SELECT host, COUNT(host) AS host_c, AVG(lineno) AS line_a FROM logstash WHERE path = '/var/log/system.log' AND lineno > 70 GROUP BY host ORDER BY host_c DESC LIMIT 100")
sqlreport.map(r => AlertMsg(r(0).toString,r(1).toString.toInt,r(2).toString.toDouble))
} else {
rdd
}
}).print()
我收到了这样的错误:
[错误] /Users/raochenlin/Downloads/spark-1.2.0-bin-hadoop2.4/logstash/src/main/scala/LogStash.scala:52:方法转换没有类型参数:(transformFunc:org.apache。 spark.rdd.RDD [String] => org.apache.spark.rdd.RDD [U])(隐式证据$ 5:scala.reflect.ClassTag [U])org.apache.spark.streaming.dstream.DStream [U ]的存在,以便可以将其应用于参数(org.apache.spark.rdd.RDD [String] => org.apache.spark.rdd.RDD [_>:LogStash.AlertMsg,字符串<:java.io.Serializable ])[错误] ---因为-[错误]参数表达式的类型与形式参数类型不兼容; 发现[错误]:org.apache.spark.rdd.RDD [String] => org.apache.spark.rdd.RDD [_>:LogStash.AlertMsg,字符串<:java.io.Serializable] [错误]必需: org.apache.spark.rdd.RDD [String] => org.apache.spark.rdd.RDD [?U] [错误] lines.transform(rdd => {[错误] ^ [错误]发现一个错误[错误](compile:compile)编译失败
似乎只有我使用sqlreport.map(r => r.toString)
才能正确使用?
dstream.transform
一个函数transformFunc: (RDD[T]) ⇒ RDD[U]
dstream.transform
transformFunc: (RDD[T]) ⇒ RDD[U]
在这种情况下, if
必须在两个条件评估中得出相同的类型,而事实并非如此:
if (count == 0) => RDD[String]
if (count > 0) => RDD[AlertMsg]
在这种情况下,请删除if rdd.count ...
的优化, if rdd.count ...
您拥有唯一的转换路径。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.