【发布时间】:2018-05-23 07:49:14
【问题描述】:
我有 2 个名为 -brand_name 和 poi_name 的数据框。
数据框 1(品牌名称):-
+-------------+
|brand_stop[0]|
+-------------+
|TOASTMASTERS |
|USBORNE |
|ARBONNE |
|USBORNE |
|ARBONNE |
|ACADEMY |
|ARBONNE |
|USBORNE |
|USBORNE |
|PILLAR |
+-------------+
数据框 2:-(poi_name)
+---------------------------------------+
|Name |
+---------------------------------------+
|TOASTMASTERS DISTRICT 48 |
|USBORNE BOOKS AND MORE |
|ARBONNE |
|USBORNE BOOKS AT HOME |
|ARBONNE |
|ACADEMY, LTD. |
|ARBONNE |
|USBORNE BOOKS AT HOME |
|USBORNE BOOKS & MORE |
|PILLAR TO POST HOME INSPECTION SERVICES|
+---------------------------------------+
我想检查数据框 1 的 brand_stop 列中的字符串是否存在于数据框 2 的名称列中。匹配应该逐行完成,然后如果匹配成功,则该特定记录应存储在新的柱子。
我尝试使用 Join 过滤数据框:-
from pyspark.sql.functions import udf, col
from pyspark.sql.types import BooleanType
contains = udf(lambda s, q: q in s, BooleanType())
like_with_python_udf = (poi_names.join(brand_names1)
.where(contains(col("Name"), col("brand_stop[0]")))
.select(col("Name")))
like_with_python_udf.show()
但这显示错误
"AnalysisException: u'Detected cartesian product for INNER join between logical plans"
我是 PySpark 的新手。请帮我解决这个问题。
谢谢
【问题讨论】:
-
加入应该为您解决问题
-
区分大小写怎么样?
-
@Steven 考虑到数据框 1 元素是大写的。之后请建议算法。
-
@RameshMaharjan 无法在这两个数据帧之间加入,因为这两个数据帧中没有“id”。如果有其他方式加入,请告诉我。
-
在上面的示例中,输出将与 Dataframe 2 相同,因为所有行都匹配成功。但是在我正在处理的原始数据框中(我的意思是两个数据框都有 6000 行 - 可能有一些不匹配的行)。在上面的例子中,我只是展示了两个数据帧的前 10 行,只是为了说明这个例子。因此,在输出数据帧中 - 只有两个数据帧之间的匹配行应该存在。
标签: python apache-spark dataframe pyspark apache-spark-sql