我正在实现一个Spark结构化的流应用程序,该应用程序处理磁盘或S3上的文件夹中的Web服务器日志文件。 Spark结构化流媒体几乎完美地适合了用例,但有一点皱纹。 文件夹中的文件名还包含计算机名称,例如。喜欢:
/ node1 _20181101.json.gz
/ node1 _20181102.json.gz
/ node2 _20181101.json.gz
/ node3 _20181102.json.gz
/ node4 _20181102.json.gz
...等等。
一个简化的版本的源代码看起来像这样(我将下面的内容变成带有窗口等的连续流)
val inputDF = spark.read
.option("codec", classOf[GzipCodec].getName)
.option("maxFilesPerTrigger", 1.toString)
.json(config.directory)
.transform { ds =>
logger.info(ds.inputFiles)
ds
}.foreach(println(_))
我想转换批处理并将节点名从文件名添加到每条记录行,-我似乎看不到任何可以用来丰富功能的 onBatch 触发器具有文件名中的节点ID的记录模式。
我看过以下内容,但似乎不适合: [FileStreamSource] [https://jaceklaskowski.gitbooks.io/spark-structured-streaming/spark-sql-streaming-FileStreamSource.html#metadataLog]
不幸的是,从文件名中获取计算机名称的句柄是稍后进行分析的关键,并且我无法控制日志的填充方式
有任何线索吗?