pyspark 当我写入parquet时,我可以排除用于分区的列吗?

hts6caw3  于 2023-01-08  发布在  Spark
关注(0)|答案(1)|浏览(202)

我需要创建parquet文件,从jdbc中阅读。表很大,所有列都是varchar。所以我创建了一个新的列,用一个随机整数来进行分区。
所以我读取jdbc看起来像这样:

data_df = sparkSession.read.format('jdbc') \
    .option('url', 'jdbc:netezza://host:port/db') \
    .option('dbtable', """(SELECT * FROM schema.table) A""") \
    .option('user', 'user') \
    .option('password', 'password') \
    .option('partitionColumn','random_number') \
    .option('lowerBound','1') \
    .option('upperBound','200') \
    .option('numPartitions','200') \
.load()

我写的 parquet 是这样的
第一个月
生成的parquet还包含“random_number”列,但我只创建了用于分区的列,是否有办法在写入parquet文件时排除该列?
谢谢你的帮助,我是新来的spark:)
我希望排除random_number列,但不知道在需要该列进行分区时是否可以这样做

iszxjhcz

iszxjhcz1#

所以,如果你想在内存中使用一个列进行重新分区,但不想写入它,你可以在写入之前使用. repartition(col("random_number"))删除该列,然后写入你的数据:

data_df = sparkSession.read.format('jdbc') \
    .option('url', 'jdbc:netezza://host:port/db') \
    .option('dbtable', """(SELECT * FROM schema.table) A""") \
    .option('user', 'user') \
    .option('password', 'password') \
    .option('partitionColumn','random_number') \
    .option('lowerBound','1') \
    .option('upperBound','200') \
    .option('numPartitions','200') \
.load()
.repartition(col("random_number")).drop("random_number")

然后:

data_df.write.mode("overwrite").parquet("parquetfile.parquet")

相关问题