使用PySpark在ArrayType列中按项目对行进行分组

时间:2019-09-13 04:56:00

标签: python pyspark pyspark-sql

我有带有这样的架构的Pyspark DataFrame

root
 |-- id: string (nullable = true)
 |-- address: string (nullable = true)
 |-- phone_list: array (nullable = true)
 |    |-- element: string (containsNull = true)

示例:

id        address        phone_list
1         HaNoi          [ 012346789, 032145698, 0565622253 ]
2         Singapore      [ 012346789, 069855633 ]
3         Moscow         [ 023466466, 069855633 ]
4         Tokyo          [ 044656611, 061316561 ]  

您可以看到id 1与id 2共有1个电话号码(012346789),而id 2与id 3共有1个电话号码(069855633),所以我想创建新的数据框将这些id分组在一起。 看起来像:

id  address                               phone_list
1   [ HaNoi , Singapore, Moscow ]         [ 012346789, 032145698, 0565622253, 069855633, 023466466 ]
2   [ Tokyo ]                            [ 044656611, 061316561 ]  

有人知道提示或解决方案吗?

2 个答案:

答案 0 :(得分:0)

在您的情况下,我会做的是

df= pyspark.sql('''select id, address, phone_number 
from table_name as tb  LATERAL VIEW EXPLODE(tb.phone_list)as phone_number ''') 

爆炸列表,然后按电话号码分组!

答案 1 :(得分:0)

您将需要首先爆炸电话号码,然后对电话号码进行分组并收集地址列表。同样,您需要对电话号码进行collect_set(collect_set()包含不同的元素,collect_list()包含所有元素)以获取不同的电话号码集。让我知道您是否需要完整的代码。