我有几个 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 上找到的所有解决方案,但到目前为止没有任何效果。有什么想法吗?
我重现了上述场景并得到了相同的错误,即使
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)
我的执行:
在我的例子中,镶木地板文件之间的架构不匹配,在这种情况下该怎么办?