将 DataFrame 列值与另一个 DataFrame 列匹配并计算命中数

     2023-04-15     40

关键词:

【中文标题】将 DataFrame 列值与另一个 DataFrame 列匹配并计算命中数【英文标题】:Match DataFrame column value against another DataFrame column and count hits 【发布时间】: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 中提取城市,添加到新列并基于此加入。 【参考方案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)

如何将逗号分隔的列值与另一个表作为行连接(代码片段)

我试图通过首先从我正在成功执行的“SupplierId”列转换逗号分隔值来加入两个表。但是,当我尝试通过外键“DCLink”连接到具有供应商名称的另一个表“供应商”时,问题就出现了。这就是我的意思:原始表的select语句,SELECTIn... 查看详情

Pyspark:将列值与另一个值进行比较

】Pyspark:将列值与另一个值进行比较【英文标题】:Pyspark:Comparecolumnvaluewithanothervalue【发布时间】:2021-04-0607:07:06【问题描述】:我有以下数据框:+----+----+----+----+|col0|col1|col2|col3|+----+----+----+----+|1|21|3|null||4|5|23|null||null|4|5|6||nu... 查看详情

当行悬停并且列值与另一行匹配时显示工具提示

】当行悬停并且列值与另一行匹配时显示工具提示【英文标题】:ShowToolTipwhenrowhoveredandcolumnvaluematcheswithanotherrow【发布时间】:2021-09-2521:48:45【问题描述】:我有一个DataGrid,它显示我的SQLServer表中的每一行,状态为Unallocated。... 查看详情

熊猫:将列值与另一列中的特定值相加

】熊猫:将列值与另一列中的特定值相加【英文标题】:Pandas:sumcolumnvaluesagainstspecificvalueinanothercolumn【发布时间】:2021-08-3002:59:30【问题描述】:我正在使用这个数据框:InvoiceNoAmountYear-Month11002019-0121252019-0232002019-0243002019-03512020... 查看详情

pyspark 将列值与另一列进行比较包含值范围

】pyspark将列值与另一列进行比较包含值范围【英文标题】:pysparkcomparecolumnvalueswithanothercolumncontainsrangeofvalues【发布时间】:2017-09-0310:39:45【问题描述】:我想将一列的值与具有参考值范围的另一列进行比较。我已尝试使用以下... 查看详情

如何将 array_intersect() 值与另一个数组中的相应键匹配?

...】:2014-01-1721:56:35【问题描述】:假设这是我的sql数据库列值:Result-Reference1A12A23A34A45A5获取上述列后,我有以下数组:$inputValue=array(1 查看详情

如何将数据框中的一行的值与另一个数据框中的多行进行比较(包括计算)

...比较(包括计算)【英文标题】:Howtocomparethevaluesofarowinadataframewithmultiplerowsfromanotherdataframe(includecalculation)【发布时间】:2020-12-2216:27:15【问题描述】:抱歉,因为写标题的英文不好。我想做的是通过与另一个数据框df2进行比较... 查看详情

将一个数组值与另一个多维数组匹配,然后从多维数组中获取值

】将一个数组值与另一个多维数组匹配,然后从多维数组中获取值【英文标题】:Matchanarrayvaluewithanothermultidimensionalarrayandthengetthevaluesfromthemultidimensionalarray【发布时间】:2020-05-2903:57:37【问题描述】:我想将数组1的值与数组2keyD... 查看详情

如何将char数组中的值与另一个char进行比较

】如何将char数组中的值与另一个char进行比较【英文标题】:Howtocomparevalueinchararraytoanotherchar【发布时间】:2017-04-1503:44:28【问题描述】:我编写了一个程序,该程序进入一个文件并将txt文件的每一行复制到一个数组的索引中,... 查看详情

如何将一个 DataFrame 中的多个列与另一个 DataFrame 连接

】如何将一个DataFrame中的多个列与另一个DataFrame连接【英文标题】:HowtojoinmultiplecolumnsfromoneDataFramewithanotherDataFrame【发布时间】:2018-07-0721:43:11【问题描述】:我有两个DataFrames推荐和电影。推荐中的列rec1-rec3表示来自电影数据... 查看详情

将包含列表的记录值与 Postgres 中的列值进行比较

】将包含列表的记录值与Postgres中的列值进行比较【英文标题】:ComparearecordvaluecontainingalistwithcolumnvaluesinPostgres【发布时间】:2021-02-0120:50:57【问题描述】:我需要编写一个选择语句,该语句必须使用一个列值将两个表链接在一... 查看详情

将一个表中的多个值与另一个表中的多个值进行比较

】将一个表中的多个值与另一个表中的多个值进行比较【英文标题】:ComparingMultipleValuesfromonetabletoMultipleValuesinanother【发布时间】:2016-04-2109:37:16【问题描述】:我正在编写一个PL/SQL存储函数脚本,但遇到了问题。我需要找到所... 查看详情

需要一种更好的方法来将一个列值与同一表行中的多个列值进行比较

】需要一种更好的方法来将一个列值与同一表行中的多个列值进行比较【英文标题】:Needabetterwaytocompareonecolumnvaluetomanycolumnvaluesinthesametablerow【发布时间】:2021-12-1222:38:50【问题描述】:我有一个这样构造的SQL2017数据表:A1235100... 查看详情

如何在更新/插入之前创建一个异常,我必须将一个表的属性值与另一个表的属性值进行比较?

...在更新/插入之前创建一个异常,我必须将一个表的属性值与另一个表的属性值进行比较?【英文标题】:HowdoIcreateanexceptiononbeforeupdate/insertwhereIhavetocomparevalueofattributeofonetabletothevalueoftheattributeofanother?【发布时间】:2018-02-2214:57:0... 查看详情

将一个表中的值与另一表中具有相同属性的值的平均值计算进行比较

】将一个表中的值与另一表中具有相同属性的值的平均值计算进行比较【英文标题】:Comparevaluesfromonetablewithaveragecalculationofvaluewithsamepropertiesinothertable【发布时间】:2019-08-0913:26:35【问题描述】:这里的第一篇文章...我正在尝试... 查看详情

将 Dataframe 列的值与列表值进行比较

】将Dataframe列的值与列表值进行比较【英文标题】:ComparevalueofDataframecolumnwithlistvalue【发布时间】:2018-11-1400:40:44【问题描述】:我有一个spark数据框列“id”和“articles”以及一个值列表“a_list”,如下所示。df=spark.createDataFrame... 查看详情

将 DataTable 列值与行过滤器 C# 中的枚举进行比较

】将DataTable列值与行过滤器C#中的枚举进行比较【英文标题】:CompareDataTableColumnValuewithEnuminRowFilterC#【发布时间】:2017-08-0708:05:24【问题描述】:我有一个要使用DataView过滤的数据表。过滤条件基于枚举值和字符串数据表列值。... 查看详情

ExtJS 4.2网格单元格编辑如何将列值与组合显示值绑定

】ExtJS4.2网格单元格编辑如何将列值与组合显示值绑定【英文标题】:ExtJS4.2gridcelleditinghowtobindcolumnvaluewithcombodisplayvalue【发布时间】:2014-08-1700:39:53【问题描述】:我有一个带有单元编辑插件的网格。我的一个列是int字段,它表... 查看详情