我使用Spark 3.5来处理一些请求,这些请求分为月份和日期:
/09/27/json-lines-file-with-a-long-name
我正在做一些过滤,并希望结果最终以相同的方式进行分桶(9月27日处理的请求进入09/27
目录)。我已经创建了hour
和day
列,所以问题是在技术上是否可以通过以某种方式插入路径来重新创建相同的目录分桶?下面是一个示例,它可能看起来像:
// obviously this doesn't work
df
.write
.options(...)
.json("$month/$day")
我知道这可能会带来性能损失,并需要特殊的分区(在我的情况下,这将创建不均匀的分区)。我已经看到了一些partitionBy
的例子,这几乎是我正在寻找的,但我相信该功能在Spark 3中不可用或被重命名。我也知道我可以在一个简单的for循环中完成它,但对存在“正确”的解决方案感到好奇。
1条答案
按热度按时间roejwanj1#
从spark 3.5开始,
partitionBy
仍然存在,它几乎完美地满足了你的需求(参见DataFrameWriter文档)。它将按如下方式写入您的文件:
我不知道有什么方法可以简单地通过配置
partitionBy
来摆脱column_name=
部分。一个解决方案是之后重命名文件。这个解决方案避免了单独阅读每个部分的框架,这很可能会慢得多。然后,如果名字不够好,你可以重命名文件。这里是一个本地文件系统的例子,但类似的方法也适用于S3或HDFS。