使用 pyspark 从 S3 读取分区 table 的镶木地板正在从分区列中删除前导零
Reading parquet partitioned table from S3 using pyspark is dropping leading zeros from partition column
我已经使用 EMR(pyspark) 将 pyspark 数据帧作为 parquet 写入 s3,此数据按列 (A) 分区,即 StringType()
在 S3 中,数据看起来像这样
table_path:
A=0003
part-file.parquet
A=C456
part-file.parquet
当我使用 pyspark 将其作为数据框读回时,我丢失了数据框 'A' 列中的前导零。这是数据的样子
df = spark.read.parquet(table_path)
df.show()
| A | B |
| 3 | ..|
|C456| ..|
我不想在这里丢失前导零。预期结果是:
| A | B |
|0003| ..|
|C456| ..|
在 delta 文档中找到了这个问题的解决方案。
Spark 默认启用 属性。使用此 属性 spark 尝试推断分区列的模式。对于字符串类型的分区列,我们可以很容易地关闭它。
# Update partition data type infer property
from pyspark.conf import SparkConf
from pyspark.sql import SparkSession, Window
conf = (SparkConf().set("spark.sql.sources.partitionColumnTypeInference.enabled", False))
sc=SparkSession.builder.config(conf=conf).getOrCreate()
我已经使用 EMR(pyspark) 将 pyspark 数据帧作为 parquet 写入 s3,此数据按列 (A) 分区,即 StringType()
在 S3 中,数据看起来像这样
table_path:
A=0003
part-file.parquet
A=C456
part-file.parquet
当我使用 pyspark 将其作为数据框读回时,我丢失了数据框 'A' 列中的前导零。这是数据的样子
df = spark.read.parquet(table_path)
df.show()
| A | B |
| 3 | ..|
|C456| ..|
我不想在这里丢失前导零。预期结果是:
| A | B |
|0003| ..|
|C456| ..|
在 delta 文档中找到了这个问题的解决方案。
Spark 默认启用 属性。使用此 属性 spark 尝试推断分区列的模式。对于字符串类型的分区列,我们可以很容易地关闭它。
# Update partition data type infer property
from pyspark.conf import SparkConf
from pyspark.sql import SparkSession, Window
conf = (SparkConf().set("spark.sql.sources.partitionColumnTypeInference.enabled", False))
sc=SparkSession.builder.config(conf=conf).getOrCreate()