我有两个这样的数据框
student_rdf = (studentid, name, ...)
student_result_rdf = (studentid, gpa, ...)
Run Code Online (Sandbox Code Playgroud)
我们需要加入这两个数据框。我们现在正在这样做,
student_rdf.join(student_result_rdf, student_result_rdf["studentid"] == student_rdf["studentid"])
Run Code Online (Sandbox Code Playgroud)
这样很简单。但是它会在工作节点之间创建大量数据改组,但是由于连接键是相似的,并且如果可以使用该键(studentid)对数据帧(理解partitionkey)进行分区,那么根本就不会进行改组。由于相似的数据将驻留在相似的节点中。可能吗?
当我从输入中读取数据帧时,我正在寻找一种基于列对数据进行分区的方法。并且如果Spark可能理解两个数据帧的两个partitionkey是相似的,那又如何呢?
我想在 3 列上对数据框“df1”进行分区。对于这 3 列,此数据框恰好有 990 个独特的组合:
In [17]: df1.createOrReplaceTempView("df1_view")
In [18]: spark.sql("select count(*) from (select distinct(col1,col2,col3) from df1_view) as t").show()
+--------+
|count(1)|
+--------+
| 990|
+--------+
Run Code Online (Sandbox Code Playgroud)
为了优化这个数据帧的处理,我想对 df1 进行分区以获得 990 个分区,每个关键可能性一个:
In [19]: df1.rdd.getNumPartitions()
Out[19]: 24
In [20]: df2 = df1.repartition(990, "col1", "col2", "col3")
In [21]: df2.rdd.getNumPartitions()
Out[21]: 990
Run Code Online (Sandbox Code Playgroud)
我写了一个简单的方法来计算每个分区中的行数:
In [22]: def f(iterator):
...: a = 0
...: for partition in iterator:
...: a = a + 1
...: print(a)
...:
In [23]: df2.foreachPartition(f)
Run Code Online (Sandbox Code Playgroud)
我注意到实际上我得到的是 628 个带有一个或多个键值的分区,以及 362 …
这里也有人问过类似的问题,但它没有正确解决我的问题。我有近 100 个数据帧,每个数据帧至少有200,000行,我需要通过full基于列进行连接来加入它们ID,从而创建一个带有列的数据帧 - ID, Col1, Col2,Col3,Col4, Col5..., Col102。
只是为了说明,我的 DataFrames 的结构 -
df1 = df2 = df3 = ..... df100 =
+----+------+------+------+ +----+------+ +----+------+ +----+------+
| ID| Col1| Col2| Col3| | ID| Col4| | ID| Col5| | ID|Col102|
+----+------+-------------+ +----+------+ +----+------+ +----+------+
| 501| 25.1| 34.9| 436.9| | 501| 22.33| | 503| 22.33| | 501| 78,1|
| 502| 12.2|3225.9| 46.2| | 502| 645.1| | 505| 645.1| | 502| 54.9| …Run Code Online (Sandbox Code Playgroud)