您好我有一个日志文件,其中包含日志事件。我需要读取行并应用正则表达式从行中获取元素并写入镶木地板文件。我有一个具有列定义的avro架构。
有人可以指导我继续这样做。
val spark = SparkSession
.builder()
.appName("SparkApp")
.config("spark.some.config.option", "some-value")
.getOrCreate()
val rdd = sc.textFile(args(0))
val schemaString = args(1)
val pattern = new Regex(args(2))
val fields = schemaString.split(" ")
.map(fieldName => StructField(fieldName, StringType, nullable = true))
val schema = StructType(fields)
val matches = rdd.map { x => pattern.findFirstMatchIn(x) }.map{ x => x.map{x => x.subgroups}}
val values = matches.map { x => x.map { x => Row(x.toArray) }}
在我获得RDD[Option[Row]]
的价值观中。
对此有任何建议。
答案 0 :(得分:0)
您正在获取RDD[Option[Row]]
,因为您使用了正则表达式。以下是findFirstMatchIn
的定义,它返回Option
def findFirstMatchIn(source: CharSequence): Option[Match]
要避免这种情况
val matches = rdd.map { x => pattern.findFirstMatchIn(x) }.map { x => x.map { x => x.subgroups }.get }
val values = matches.map { x => x.map { x => Row(x.toArray) } }
结果
RDD[List[Row]]
要防守,您可以考虑getOrElse
而不是get
如果只想flatmap
RDD[Row]