Warm tip: This article is reproduced from serverfault.com, please click

apache spark-使用pyspark使用新架构从另一个实木复合地板中写入实木复合地板

(apache spark - Write parquet from another parquet with a new schema using pyspark)

发布于 2020-12-03 18:53:03

我正在使用pyspark数据帧,我想读取一个镶木地板文件,并使用与原始文件不同的模式来写入它

原始模式是(它具有9.000个变量,我仅将前5个作为示例):

[('id', 'string'),
 ('date', 'string'),
 ('option', 'string'),
 ('cel1', 'string'),
 ('cel2', 'string')]

我想写:

[('id', 'integer'),
 ('date', 'integer'),
 ('option', 'integer'),
 ('cel1', 'integer'),
 ('cel2', 'integer')]

我的代码是:

df = sqlContext.read.parquet("PATH")

### SOME OPERATIONS ###

write_schema = StructType([StructField('id'  , IntegerType(), True),
                           StructField('date'  , IntegerType(), True),
                           StructField('option'  , IntegerType(), True),
                           StructField('cel1'  , IntegerType(), True),
                           StructField('cel2'  , IntegerType(), True) ])


df.option("schema",write_schema).write("PATH")

运行它之后,我仍然具有与原始数据相同的架构,所有内容都是字符串,该架构未更改


我也尝试使用

df = sqlContext.read.option("schema",write_schema).parquet(PATH)

当我阅读该选项时,它不会更改架构,它显示的是原始架构,因此我使用(建议在此处使用):

df = sqlContext.read.schema(write_schema).parquet(PATH)

如果我看到所得到的类型,那么这些将适用于阅读部分:

df.dtypes

#>>[('id', 'int'),
#   ('date', 'int'),
#   ('option', 'int'),
#   ('cel1', 'int'),
#   ('cel2', 'int')]

但是,当我尝试写实木复合地板时,我得到了一个错误:

Parquet column cannot be converted. Column: [id], Expected: IntegerType, Found: BINARY

问候

Questioner
Joe
Viewed
0
mck 2020-12-04 03:49:54

将你的列转换为int,然后尝试写入另一个拼花文件。无需架构规范。

df = spark.read.parquet("filepath")
df2 = df.select(*map(lambda col: df[col].cast('int'), df.columns))
df2.write.parquet("filepath")