根据Spark中的列值从hive / hdfs读取数据时对数据进行分区

时间:2018-10-08 19:25:00

标签: apache-spark dataframe join apache-spark-sql partitioning

我有2个使用sqlContext从蜂巢读取的spark数据帧。让我们将这些数据帧称为df1df2。两个数据帧中的数据都在配置单元级别的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列上的df2PolicyNumber。我可以运行以下代码并获取所需的输出。

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 1df1的行以及PolicyNumber=1df2的行。 同样,PolicyNumber=1将包含Executor 2中带有df1的行,以及PolicyNumber=2中具有df2的行,依此类推。

这样,现在就不需要任何洗牌了,数据是该执行者的本地数据。

我的问题是,有没有办法以这种粒度控制分区?如果是的话,我该怎么做。

1 个答案:

答案 0 :(得分:0)

不幸的是,无法直接控制浮动到每个执行器中的数据,但是,当您将数据读取到每个数据帧中时,请在连接列上使用CLUSTER BY,这有助于将数据排序到正确的执行器中。

ex: 
df1 = sqlContext.sql("select * from CLSUTER BY JOIN_COLUMN")
df2 = sqlContext.sql("SELECT * FROM TABLE2 CLSUTER BY JOIN_COLUMN")

希望有帮助。