Перераспределение ожидает either int or column
, поэтому нам нужно передать col("<col_name>")
на фрейм данных.
Example:
df=spark.createDataFrame([(1,'a',),(2,'b',),(3,'c',)],['id','name'])
df.rdd.getNumPartitions() #number of partitions in df
1
Repartition on int:
df.repartition(10).rdd.getNumPartitions() #repartition to 10
10
Repartition on columns:
df.repartition(col("id"),col("name")).rdd.getNumPartitions() #repartition on columns
200
Dynamic repartition on columns:
df.repartition(*[col(c) for c in df.columns]).rdd.getNumPartitions()
200
картазатем введите columns list
- column
вместо string
, а затем передайте имена столбцов в repartition.
For your case try this way:
df.repartition(*[col(c) for c in re_parti_list])
.write
.partitionBy(parti_str)
.mode(write_mode).format(tgt_file_format)
.option('compression', tgt_file_compression).option("nullValue", "null").option("treatEmptyValuesAsNulls,", "true")
.save(write_tgt_loc))
In scala:
df.repartition(df.columns.map(c => col(c)):_*).rdd.getNumPartitions
200