将 Spark DF 写入 parquet 时出错(Parquet 列无法转换。列:[word_c],预期:StringType,发现:INT64

问题描述 投票:0回答:2

我有几个 parquet 文件分布在不同的文件夹中,我正在使用以下命令将它们读入 Databricks 上的 Spark DF:

df = spark.read.option("mergeSchema", "true").schema(parquet_schema).parquet('/mnt/my_blobstorage/snap/*/*.parquet')

我的镶木地板架构仅包含 StringType。然后我显示 Dataframe,另外我还执行 PrintSchema 以确保所有列都是 StringType。 当我尝试使用以下命令将此 DF 写回我的 Blob 存储时:

df.write.parquet('/mnt/my_blobstorage/saved/merged_df.parquet')

它给了我以下错误:

Parquet column cannot be converted. Column: [word_c], Expected: StringType, Found: INT64

我已经尝试了在 StackOverflow 上找到的所有解决方案,但到目前为止没有任何效果。有什么想法吗?

dataframe apache-spark pyspark databricks azure-data-lake
2个回答
0
投票

我重现了上述场景并得到了相同的错误,即使

printSchema
给出了正确的模式。

我同意 @partlov,这里的数据框从镶木地板文件中获取了模式,这就是错误的原因。

在这种情况下,您可以尝试以下解决方法来解决该错误。

首先阅读镶木地板文件,而不提供您的架构。之后,使用以下代码将列类型转换为字符串。现在,您可以将其写入最终的镶木地板文件中。

df3 = spark.read.option("mergeSchema", "true").parquet('/mnt/mountdata/snap/*/*.parquet')
df3.printSchema()

from pyspark.sql.types import *
from pyspark.sql.functions import col
for i in df3.dtypes:
    if i[1]!="string":
        df3=df3.withColumn(i[0],col(i[0]).cast(StringType()))
        print("done for column : ",i[0])
print("dataframe with required schema : ")
df3.printSchema()
display(df3)

我的执行:


0
投票

在我的例子中,镶木地板文件之间的架构不匹配,在这种情况下该怎么办?

© www.soinside.com 2019 - 2024. All rights reserved.