我们正在使用MapR FS滚动卷,并且有必要将分区的输出镶木文件与相应的卷对齐。
df
.write
.partitionBy("year", "month", "day", "hour")
.parquet("/data/nfs/{year}/{month}/{day}/datastore")
这个想法是在运行时通过自定义输出提交程序解析路径:
class MaprParquetOutputComitter(outputPath: Path, context: TaskAttemptContext)
extends ParquetOutputCommitter(
MaprParquetOutputComitter.resolvePath(outputPath),
context)
object MaprParquetOutputComitter extends StrictLogging {
def resolvePath(p: Path): Path = {
logger.info(p.toString)
// Retrieve year, month and day from path object
// and replace placeholders with extracted values
new Path(resolvedPath)
}
}
不幸的是,看来outputPath
看起来像这样的"/data/nfs/{year}/{month}/{day}/datastore"
,而不是"/data/nfs/{year}/{month}/{day}/datastore/year=2018/month=6/day=25/hour=8"
。
是否有任何方法可以通过这种方法(覆盖ParquetOutputCommitter
)获取其中包含分区的输出路径?或者,也许还有另一种解决方案可以实现这一目标?