可以使用Spark的repartition函数来对DataFrame进行重分区。可以设置分区数,但是通常最好将分区数保持在200以下,以避免出现大量小分区。在此基础上,可以根据一个高基数列的值来对数据框进行分区,以避免其中一列的值太过集中,分布不均匀。
代码示例:
df = spark.read.csv("data.csv",header=True,inferSchema=True)
card_col = "column_name" cardinality = df.select(card_col).distinct().count() print("Cardinality of",card_col,"is",cardinality)
num_partitions = 2*df.rdd.getNumPartitions() if num_partitions>200: num_partitions = 200
df_repartitioned = df.repartition(num_partitions,card_col)
df_repartitioned.groupBy(card_col).count().orderBy("count",ascending=False).show()
上一篇:保持分离的KTable