从文件中读取行应用正则表达式并写入镶木地板文件scala spark

时间:2017-05-05 12:17:20

标签: scala apache-spark

您好我有一个日志文件,其中包含日志事件。我需要读取行并应用正则表达式从行中获取元素并写入镶木地板文件。我有一个具有列定义的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]]的价值观中。 对此有任何建议。

1 个答案:

答案 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]