【问题标题】:Pyspark Custom group By in DataFrameDataFrame中的Pyspark自定义组
【发布时间】:2018-04-18 11:47:52
【问题描述】:

我有一个如下火花数据框:

s. no | address            | name | DoB
1     | st. 1 h.no 16      | X    | 1-1-2001
2     | str n.1 house 16   | Y    | 1-5-2001
3     | st. 3   h.no 1     | Z    | 1-8-2002

现在读取地址,我们可以发现 X 和 Y 住在同一所房子里,以不同的方式输入相同的地址。我的目标是在同一地址下按地址分组,制作家庭数据框。

问题是没有明确的列可以执行标准 groupby。我有一个功能来查找两个地址是否相同或不同。

有没有办法利用它来执行自定义分组依据。 最终结果将是这样的:

s. no | address            | names | DoB
1     | st. 1 h.no 16      | X,Y   | 1-1-2001, 1-5-2001
3     | st. 3   h.no 1     | Z     | 1-8-2002

【问题讨论】:

  • 这不是一个小问题,因为您可能会遇到连接组件的问题。假设第 1 行与第 2 行相似,第 2 行与第 3 行相似,但您的函数说第 1 行和第 3 行不相似?如果您想要一个快速的解决方案,我会说创建一个函数来规范您的地址,以便您可以执行标准的 groupby 和 collect_list。只需做一些正则表达式,例如将r"str\s+" 更改为"st."r"h\.no\b" 更改为"house" 等。这样您就可以将所有相似的地址转换为同一个字符串。
  • 很好的答案,但问题是不同的人可以以不同的格式输入不同的地址。他们认为合适的唯一共同点是,如果两个人谈论相同的地址,那么他们提到的地址的相同组成部分发生了变化,我可以将其与函数进行比较。所以假设我根据没有提供的街道规范了一个地址,而在其他地址中可能有其他东西

标签: python group-by pyspark customization


【解决方案1】:
dataframe
.withColumn('address_unique', your_function('address'))
.groupBy('address_unique')
.agg(collect_list('names'), collect_list('DoB'))

更新:

A) 找出地址之间的相似性并将其放入单独的数据集中:Address1、Address2。

adr_map = df.alias('a').join(df.alias('b'),
  on = (is_same(col('a.address'), col('b.address'))) && (col('a.s_no') > col('b.s_no')), 
  how = 'left'
).select(col('a.address').alias('a1'), col('b.address').alias(a2)).filter(col('a2').isNotNull())

B) 将原始数据集与映射数据集连接起来,并添加具有所有相同地址通用的“首地址”的列。

df.join(adr_map, on = col('address') == col('a2'), how='left')
.withColumn('first_address', when(col('a1').isNull(), 'address').otherwise(col('a1')))

C) 按 first_address 分组 ...

注意:它不包括上面评论中描述的场景。 如果你的函数不够完善,没有涵盖传递关系,你会看到不同的组。

if A1 = A2 and A2 = A3 then A1 should be equals A3.

还有一些其他的边缘情况需要介绍(在您的输出中会重复出现),但希望您有一个想法并且可以从它开始。

【讨论】:

  • 我的函数接受两个参数并返回 True/False。它不适用于一列
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-26
  • 1970-01-01
  • 2016-06-29
相关资源
最近更新 更多