PySpark - partitionBy 到 S3 处理特殊字符

Posted

技术标签:

【中文标题】PySpark - partitionBy 到 S3 处理特殊字符【英文标题】:PySpark - partitionBy to S3 handle special character 【发布时间】:2020-05-27 07:57:07 【问题描述】:

我的数据框中有一个名为target_col_a 的列,其时间戳值已转换为字符串,例如2020-05-27 08:00:00.

然后我partitionBy这个专栏如下。

target_dataset \
    .write.mode('overwrite') \
    .format('parquet') \
    .partitionBy('target_col_a') \
    .save('s3://my-bucket/my-path')

但是,我的 s3 路径变成了 s3://my-bucket/my-path/target_col_a=2020-05-27 08%3A00%3A00/part-0-file1.snappy.parquet

有没有办法输出没有%3A的分区并保留:

注意:当我使用 Glue native DynamicFrame 写入 S3 或 Redshift UNLOAD 写入 S3 时,分区会根据需要进行(没有 %3A:),例如

glueContext.write_dynamic_frame.from_options(
    frame = target_dataset,
    connection_type = "s3",
    connection_options = 
        "path": "s3://my-bucket/my-path/",
        "partitionKeys": ["target_col_a"],
    format = "parquet",
    transformation_ctx = "datasink2"
)

【问题讨论】:

【参考方案1】:

简短的回答是不,你不能。

Pyspark 使用 hadoop 客户端库进行输入和输出。这些库使用Java URI package 创建路径。空格和冒号不是有效的 URI 字符,因此在写入之前它们是 URL encoded。 Pyspark 将在读取数据集时自动处理解码,但如果您想访问 Spark 或 Hadoop 之外的数据集,则需要 URL decode 列值。

【讨论】:

【参考方案2】:

空格: 等特殊字符不能成为任何S3 URI 的一部分。 即使有些方法设法创建了一个,您以后每次使用它们时都会遇到困难。

最好将这些字符替换为 URI 可接受的字符。

您应该遵循本段中描述的密钥名称约定,称为 Amazon S3 的 Object Key Guidelines。

以下字符集通常可以安全地用于键名:

字母数字字符 [0-9a-zA-Z]

特殊字符 !, -, _, ., *, ', (, and )

【讨论】:

以上是关于PySpark - partitionBy 到 S3 处理特殊字符的主要内容,如果未能解决你的问题,请参考以下文章

尝试在 PySpark 中使用 partitionBy 写入 csv 时出错

在 pyspark 数据框中使用 write.partitionBy 时如何删除重复项?

对两列应用 Window.partitionBy 以在 pyspark 中获取 n-core 数据集

Pyspark:重新分区与分区

pyspark 近似分位数函数

pyspark中的累积和