我尝试使用Spark数据帧而不是rdd,因为它们看起来比rdd更高级,并且倾向于生成更可读的代码。
在一个14个节点的Google Dataproc集群中,我有大约600万个名字被两个不同的系统翻译成ids:sa
和sb
。每个Row
包含name
、id_sa
和id_sb
。我的目标是生成从id_sa
到id_sb
的映射,这样对于每个id_sa
,对应的id_sb
是附加到id_sa
的所有名称中最频繁的id。
让我们试着用一个例子来说明。如果我有以下行:
[Row(name='n1', id_sa='a1', id_sb='b1'),
Row(name='n2', id_sa='a1', id_sb='b2'),
Row(name='n3', id_sa='a1', id_sb='b2'),
Row(name='n4', id_sa='a2', id_sb='b2')]
我的目标是生成从a1
到b2
的映射。实际上,与a1
相关联的名称是n1
、n2
和n3
,它们分别映射到b1
、b2
和b2
,因此b2
是与a1
相关联的名称中最频繁的映射。以同样的方式,a2
将映射到b2
。假设总会有赢家是可以的:不需要打破关系。
我希望可以在数据帧上使用groupBy(df.id_sa)
,但我不知道接下来该怎么做。我希望一个聚合可以最终生成以下行:
[Row(id_sa=a1, max_id_sb=b2),
Row(id_sa=a2, max_id_sb=b2)]
但也许我试图使用错误的工具,我应该回去使用RDD。
我想你要找的是窗口函数: http://spark.apache.org/docs/latest/api/python/pyspark.sql.html?highlight=window#pyspark.sql.Window
https://databricks.com/blog/2015/07/15/introducing-window-functions-in-spark-sql.html
下面是Scala中的一个例子(我现在没有一个带有Hive的Spark Shell,所以我无法测试代码,但我认为它应该可以工作):
使用窗口函数可能有更有效的方法来实现相同的结果,但我希望这能为您指明正确的方向。
使用
join
(如果是绑定,将在组中生成多行):使用窗口函数(将删除关系):
使用
struct
排序:另见How to select the first row of each group?
相关问题 更多 >
编程相关推荐