我正在使用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
问候
将你的列转换为int
,然后尝试写入另一个拼花文件。无需架构规范。
df = spark.read.parquet("filepath")
df2 = df.select(*map(lambda col: df[col].cast('int'), df.columns))
df2.write.parquet("filepath")
嗨,谢谢,有10MM行和9.000列,这是最佳选择吗?是否并行化?
当然可以
谢谢,我会尝试一下,只是现在有点好奇,您知道为什么write.parquet不会更改架构吗?
@Joe是因为write.parquet不接受架构作为参数-请参见spark.apache.org/docs/latest/api/python/…