在Spark中插入目标路径

tjrkku2a  于 2023-10-23  发布在  Apache
关注(0)|答案(1)|浏览(107)

我使用Spark 3.5来处理一些请求,这些请求分为月份和日期:

/09/27/json-lines-file-with-a-long-name

我正在做一些过滤,并希望结果最终以相同的方式进行分桶(9月27日处理的请求进入09/27目录)。我已经创建了hourday列,所以问题是在技术上是否可以通过以某种方式插入路径来重新创建相同的目录分桶?下面是一个示例,它可能看起来像:

// obviously this doesn't work
df
  .write
  .options(...)
  .json("$month/$day")

我知道这可能会带来性能损失,并需要特殊的分区(在我的情况下,这将创建不均匀的分区)。我已经看到了一些partitionBy的例子,这几乎是我正在寻找的,但我相信该功能在Spark 3中不可用或被重命名。我也知道我可以在一个简单的for循环中完成它,但对存在“正确”的解决方案感到好奇。

roejwanj

roejwanj1#

从spark 3.5开始,partitionBy仍然存在,它几乎完美地满足了你的需求(参见DataFrameWriter文档)。
它将按如下方式写入您的文件:

/month=09/day=27/json-lines-file-with-a-long-name

我不知道有什么方法可以简单地通过配置partitionBy来摆脱column_name=部分。一个解决方案是之后重命名文件。这个解决方案避免了单独阅读每个部分的框架,这很可能会慢得多。

// An example
spark.range(5)
     .select('id % 2 as "m", 'id % 4 as "m2",  'id)
     .write.mode("overwrite")
     .partitionBy("m", "m2")
     .json("test2")
> tree test2
tree test2
test2
├── m=0
│   ├── m2=0
│   │   ├── part-00003-8d4921cb-1280-416a-8a0c-cc133b15c42d.c000.json
│   │   └── part-00015-8d4921cb-1280-416a-8a0c-cc133b15c42d.c000.json
│   └── m2=2
│       └── part-00009-8d4921cb-1280-416a-8a0c-cc133b15c42d.c000.json
├── m=1
│   ├── m2=1
│   │   └── part-00006-8d4921cb-1280-416a-8a0c-cc133b15c42d.c000.json
│   └── m2=3
│       └── part-00012-8d4921cb-1280-416a-8a0c-cc133b15c42d.c000.json
└── _SUCCESS

然后,如果名字不够好,你可以重命名文件。这里是一个本地文件系统的例子,但类似的方法也适用于S3或HDFS。

import java.nio.file.{Files, Path, Paths}

def rename_spark_partitions(path : Path) {
    if (Files.isDirectory(path))
        Files.list(path).forEach(rename_spark_partitions _)
    val name = path.getFileName.toString
    if(name.contains("="))
        Files.move(path, path.resolveSibling( name.split("=")(1))) 
}
rename_spark_partitions(Paths.get("test2"))
> tree test2
test2
├── 0
│   ├── 0
│   │   ├── part-00003-8d4921cb-1280-416a-8a0c-cc133b15c42d.c000.json
│   │   └── part-00015-8d4921cb-1280-416a-8a0c-cc133b15c42d.c000.json
│   └── 2
│       └── part-00009-8d4921cb-1280-416a-8a0c-cc133b15c42d.c000.json
├── 1
│   ├── 1
│   │   └── part-00006-8d4921cb-1280-416a-8a0c-cc133b15c42d.c000.json
│   └── 3
│       └── part-00012-8d4921cb-1280-416a-8a0c-cc133b15c42d.c000.json
└── _SUCCESS

相关问题