繁体   English   中英

通过Spark Streaming在DStream.transform()中使用SQL?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM