【问题标题】:Match DataFrame column value against another DataFrame column and count hits将 DataFrame 列值与另一个 DataFrame 列匹配并计算命中数
【发布时间】:2020-06-26 07:24:52
【问题描述】:

我有两个 Spark DataFrame。其中df1 包含地址和df2 街道名称、城市、地区等。

df1 = spark.createDataFrame([
  ["001", "Luc  Krier","2363  Ryan Road, Long Lake South Dakota","2363RyanRoad,LongLakeSouthDakota"],
  ["002", "Jeanny  Thorn","2263 Patton Lane Raleigh North Carolina","2263PattonLaneRaleighNorthCarolina"],
  ["003", "Teddy E Beecher","2839 Hartland Avenue Fond Du Lac Wisconsin","2839HartlandAvenueFondDuLacWisconsin"],
  ["004", "Philippe  Schauss","1 Im Oberdorf Allemagne","1ImOberdorfAllemagne"],
 ["005", "Meindert I Tholen","Hagedoornweg 138 Amsterdam","Hagedoornweg138Amsterdam"]
]).toDF("id","name","address1", "address2")

df2 = spark.createDataFrame([
 ["US","Amsterdam"],
 ["US","SouthDakota"],
 ["LU","Allemagne"],
 ["FR","Allemagne"],
 ["NL","Amsterdam"],
 ["NL","Rotterdam"],
 ["US","Wisconsin"],
 ["AU","Wisconsin"],
 ["AU","Hartland"]
]).toDF("cc","point")

我想检查 df1['address2'] 是否包含来自 df2['point'] 的任何值,并且预期结果是(虚构且不符合数据框示例)一个新列 cc 与值喜欢:

('US':1)
('US':2)('NL':1)
('US':3)('FR':1)('LU':1)
('NL':1)

从df2['cc'] 返回cc 和匹配数。一个地址可以命中来自df2 的多个值。按匹配数排序(最高优先)

【问题讨论】:

  • 您的桌子大小如何?您将创建一个交叉连接,这在性能方面非常糟糕。
  • @Steven df1 约。 25.000.000 和 df2 大约 12.000.000
  • 是否可以将 address2 拆分为几个单词?例如使用大写字母。
  • @Steven 是的,这是可能的。我删除了两个 DataFrame 中的空格,但可以更改。所以 df2 中的“SouthDakota”是原始的“South Dakota”
  • 城市总是地址的最后一部分吗?如果是这样,可以尝试使用正则表达式从 address1 中提取城市,添加到新列并基于此加入。

标签: python dataframe apache-spark pyspark


【解决方案1】:

您可以执行“条件”联接。请注意,就像他的评论中提到的@Steven,这将创建一个交叉连接。性能方面,这将不是您的最佳选择。但要知道,如果不考虑性能,您尝试实现的目标是可能的。

df_join = df1.join(df2, df1.address2.contains(df2.point), how='left')
result = df_join
         .groupBy('id','name','address1', 'cc').count()
         .select('id', 'name', 'address1', f.concat(f.lit("'"), f.col("cc"), f.lit("':"), f.col("count")).alias('cc'))
         .groupBy('id','name','address1').agg(f.concat_ws("", f.collect_list(f.col("cc"))).alias('cc'))

广播 df2(最小的)可能会有所帮助。

PySpark and broadcast join example

【讨论】:

  • 这并没有给我想要的输出,例如('US':3)('FR':1)('LU':1)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-19
  • 2021-11-09
  • 2022-07-14
  • 2020-06-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多