,也可以想到
嗨,我有一个具有日志事件的日志文件。我需要读取行并应用正则以使元素从行中获取并写入papquet文件。我有一个具有列定义的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]]
。对此的任何建议。
您正在获取RDD[Option[Row]]
,因为您确实是regex.following是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
如果只需要RDD[Row]
flatmap