我有2个使用sqlContext
从蜂巢读取的spark数据帧。让我们将这些数据帧称为df1
和df2
。两个数据帧中的数据都在配置单元级别的Column
上的PolicyNumber
上排序。 PolicyNumber
也是两个数据帧的主键。下面是两个数据框的样本值,尽管实际上,我的两个数据框都是巨大的,并以5个分区分布在5个执行器上。 为简单起见,我假设每个分区都有一个记录。
Sample df1
PolicyNumber FirstName
1 A
2 B
3 C
4 D
5 E
Sample df2
PolicyNumber PremiumAmount
1 450
2 890
3 345
4 563
5 2341
现在,我想加入df1
列上的df2
和PolicyNumber
。我可以运行以下代码并获取所需的输出。
df1.join(df2,df1.PolicyNumber=df2.PolicyNumber)
现在,我想避免尽可能多的改组以使此连接高效。因此,为了避免乱序,从蜂巢读取数据时,我想基于df1
PolicyNumber
的值对Column
进行分区,以使带有PolicyNumber 1
的行进入{ {1}},带有Executor 1
的行将转到PolicyNumber 2
,带有Executor 2
的行将转到PolicyNumber 3
,依此类推。而且我也想以与Executor 3
完全相同的方式对df2
进行分区。
这样,df1
现在将同时具有Executor 1
和df1
的行以及PolicyNumber=1
和df2
的行。
同样,PolicyNumber=1
将包含Executor 2
中带有df1
的行,以及PolicyNumber=2
中具有df2
的行,依此类推。
这样,现在就不需要任何洗牌了,数据是该执行者的本地数据。
我的问题是,有没有办法以这种粒度控制分区?如果是的话,我该怎么做。
答案 0 :(得分:0)
不幸的是,无法直接控制浮动到每个执行器中的数据,但是,当您将数据读取到每个数据帧中时,请在连接列上使用CLUSTER BY
,这有助于将数据排序到正确的执行器中。>
ex:
df1 = sqlContext.sql("select * from CLSUTER BY JOIN_COLUMN")
df2 = sqlContext.sql("SELECT * FROM TABLE2 CLSUTER BY JOIN_COLUMN")
希望有帮助。