pyspark 将Spark DF写入parquet时出错(无法转换Parquet列,列:[word_c],预期值:找到StringType:INT64

wtlkbnrh  于 2023-04-11  发布在  Spark
关注(0)|答案(1)|浏览(146)

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

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

我的parquet schema只包含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上找到的所有解决方案,到目前为止都没有任何效果。有什么想法吗?

eivnm1vs

eivnm1vs1#

我复制了上面的场景,得到了同样的错误,即使printSchema给出了正确的模式。

我同意**@partlov**的观点,这里的dataframe从parquet文件中获取了模式,这就是错误的原因。

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

首先在不给出模式的情况下读取parquet文件。之后使用下面的代码将列类型转换为String。现在,您可以将其写入最终的parquet文件。

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)

我的执行:

相关问题