写入 s3 时重复的分区列
Duplicate partition columns on write s3
我正在处理数据并使用以下代码将其写入 s3:
spark = SparkSession.builder.config('spark.sql.sources.partitionOverwriteMode', 'dynamic').getOrCreate()
df = spark.read.parquet('s3://<some bucket>/<some path>').filter(F.col('processing_hr') == <val>)
transformed_df = do_lots_of_transforms(df)
# here's the important bit on how I'm writing it out
transformed_df.write.mode('overwrite').partitionBy('processing_hr').parquet('s3://bucket_name/location')
基本上,我试图用数据框中的内容覆盖分区,但将之前处理过的分区留在 s3 中。
此写入继续发生,但随机失败并具有一定的一致性。静默写入失败。当我从 's3://bucket_name/location' 读回数据时,出现以下错误:
py4j.protocol.Py4JJavaError: An error occurred while calling o85.parquet.
: java.lang.AssertionError: assertion failed: Conflicting partition column names detected:
Partition column name list #0: processing_hr, processing_hr
Partition column name list #1: processing_hr
For partitioned table directories, data files should only live in leaf directories.
And directories at the same level should have the same partition column name.
Please check the following directories for unexpected files or inconsistent partition column names:
s3://bucket_name/location/processing_hr=2019-09-19 13%3A00%3A00
s3://bucket_name/location/processing_hr=2019-09-19 20%3A00%3A00
s3://bucket_name/location/processing_hr=2019-09-19 12%3A00%3A00/processing_hr=2019-09-19 12%3A00%3A00
我对这怎么会发生感到困惑。如何防止 spark 复制我的分区列?
我已经尝试查看文档、spark jira,但似乎仍然找不到与此相关的任何内容。
这似乎是由于 S3 最终不一致问题造成的。如果使用 EMR < 5.30,请使用 EMRFS 一致视图。或者升级到 EMR 5.30,其中最新的 EMRFS 似乎已经解决了这个问题。
我正在处理数据并使用以下代码将其写入 s3:
spark = SparkSession.builder.config('spark.sql.sources.partitionOverwriteMode', 'dynamic').getOrCreate()
df = spark.read.parquet('s3://<some bucket>/<some path>').filter(F.col('processing_hr') == <val>)
transformed_df = do_lots_of_transforms(df)
# here's the important bit on how I'm writing it out
transformed_df.write.mode('overwrite').partitionBy('processing_hr').parquet('s3://bucket_name/location')
基本上,我试图用数据框中的内容覆盖分区,但将之前处理过的分区留在 s3 中。
此写入继续发生,但随机失败并具有一定的一致性。静默写入失败。当我从 's3://bucket_name/location' 读回数据时,出现以下错误:
py4j.protocol.Py4JJavaError: An error occurred while calling o85.parquet.
: java.lang.AssertionError: assertion failed: Conflicting partition column names detected:
Partition column name list #0: processing_hr, processing_hr
Partition column name list #1: processing_hr
For partitioned table directories, data files should only live in leaf directories.
And directories at the same level should have the same partition column name.
Please check the following directories for unexpected files or inconsistent partition column names:
s3://bucket_name/location/processing_hr=2019-09-19 13%3A00%3A00
s3://bucket_name/location/processing_hr=2019-09-19 20%3A00%3A00
s3://bucket_name/location/processing_hr=2019-09-19 12%3A00%3A00/processing_hr=2019-09-19 12%3A00%3A00
我对这怎么会发生感到困惑。如何防止 spark 复制我的分区列?
我已经尝试查看文档、spark jira,但似乎仍然找不到与此相关的任何内容。
这似乎是由于 S3 最终不一致问题造成的。如果使用 EMR < 5.30,请使用 EMRFS 一致视图。或者升级到 EMR 5.30,其中最新的 EMRFS 似乎已经解决了这个问题。