Apache spark 使用spark筛选与日志文件中的字匹配的行时出错

Apache spark 使用spark筛选与日志文件中的字匹配的行时出错,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我的目标是用日志文件中的错误消息构建rdd。 我正在读取日志文件并过滤与单词“ERROR”匹配的行,我需要将错误消息作为RDD框架写入数据库 我是新手 import org.apache.spark.rdd.RDD import org.apache.spark.sql.Row import org.apache.spark.sql.SQLContext val sqlContext = new SQLContext(sc) val df = sqlContext.read.text( "hdf

我的目标是用日志文件中的错误消息构建rdd。 我正在读取日志文件并过滤与单词“ERROR”匹配的行,我需要将错误消息作为RDD框架写入数据库

我是新手

import org.apache.spark.rdd.RDD
import org.apache.spark.sql.Row
import org.apache.spark.sql.SQLContext
val sqlContext = new SQLContext(sc)
val df = sqlContext.read.text( "hdfs://10.90.3.78:9000/user/centuryuidt-3-1-1.out")
val patt: String = "ERROR"
val rdd=df.filter(line => line.contains(patt)).collect()
df.foreach(println)
当我执行这段代码时,我得到了下面的异常

<console>:40: error: value contains is not a member of org.apache.spark.sql.Row
       val rdd=df.filter(line => line.contains(patt)).collect()
                                      ^
<console>:43: error: overloaded method value foreach with alternatives:
  (func: org.apache.spark.api.java.function.ForeachFunction[org.apache.spark.sql.Row])Unit <and>
  (f: org.apache.spark.sql.Row => Unit)Unit
 cannot be applied to (Unit)
       df.foreach(println)
          ^
这对我来说很有效,但我需要用行来构建一个DF,它只给了我一行中所有的错误行。
有人能帮我把行分成几行吗?

以下是我的完整示例:

scala> val df = spark.read.text("errors.txt")
df: org.apache.spark.sql.DataFrame = [value: string]

scala> df.show
+------+
| value|
+------+
|line 1|
| ERROR|
|line 2|
| ERROR|
+------+


scala> val errors = df.filter(row => row.getString(0).contains("ERROR"))
errors: org.apache.spark.sql.Dataset[org.apache.spark.sql.Row] = [value: string]

scala> errors.collect.foreach(println)
[ERROR]
[ERROR]
如果您确实需要将错误作为RDD-请注意,这是一个RDD[行]:

scala> errors.rdd
res7: org.apache.spark.rdd.RDD[org.apache.spark.sql.Row] = MapPartitionsRDD[13] at rdd at <console>:34
scala>errors.rdd
res7:org.apache.spark.rdd.rdd[org.apache.spark.sql.Row]=MapPartitionsRDD[13]位于rdd at:34
如果确实需要将错误作为RDD[String]:

scala> errors.map(_.getString(0)).rdd
res9: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[19] at rdd at <console>:34
scala>errors.map(u.getString(0)).rdd
res9:org.apache.spark.rdd.rdd[String]=MapPartitionsRDD[19]位于rdd at:34

Nope我面临以下错误:29:error:value getString不是String val filtered=lines.filter(row=>row.getString(0).contains(“error”)^我在上面添加了一个完整的示例。这在Spark 2.3中起作用。如果我使用SQLContext实例而不是SparkSession,它也可以工作。注意:如果您需要一个带有error列的RDD,那么只需调用errors.rddThanks以获取代码和清晰的解释。它工作得很好。如果我需要打印下两行以及错误行,那么我需要在代码中更改什么。?请在这种情况下帮助我谢谢
scala> errors.map(_.getString(0)).rdd
res9: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[19] at rdd at <console>:34