在pyspark中有没有好看的代码来执行不区分大小写的join?比如:
df3 = df1.join(df2, ["col1", "col2", "col3"], "left_outer", "case-insensitive")
或者你的工作方法是什么?
mzaanser1#
我相信实现这一目标的最好方法是改变其中的每一个 key 将列转换为大写或小写(可能创建新列或仅对其应用转换),然后应用联接。
key
nbnkbykc2#
它并不十分优雅,但您可以为这些列创建新的小写版本,只用于连接。
import pyspark.sql.functions as F df1_l = df1 \ .withColumn("col1_l", F.lower(df1.col1)) \ .withColumn("col2_l", F.lower(df1.col2)) \ .withColumn("col3_l"), F.lower(df1.col3) df2_l = df2 \ .withColumn("col1_l", F.lower(df2.col1)) \ .withColumn("col2_l", F.lower(df2.col2)) \ .withColumn("col3_l"), F.lower(df2.col3) df3 = df1_l.join(df2_l, ["col1_l", "col2_l", "col3_l"], "left_outer")
你也可以尝试在连接 predicate 中做同样的转换,例如:
df3 = df1.join(df2, (F.lower(df1.col1) == F.lower(df2.col1)) & (F.lower(df1.col2) == F.lower(df2.col2)) & (F.lower(df1.col3) == F.lower(df2.col3)) "left_outer")
7cjasjjr3#
我这样做:x=y.join(z,lower(y.userid)==lower(z.userid))
csga3l584#
好吧,据我所知,除了一些准备步骤,别无选择。最后我是这样做的:
from pyspark.sql.functions import udf # udf ---------------------------- def upper(string): return string.upper() upper = udf(upper) # run ---------------------------- df1 =df1.select(df1.upper('col1'),df1.upper('col2'),df1.upper('col3')) df2 =df2.select(df2.upper('col1'),df2.upper('col2'),df2.upper('col3')) # join --------------------------- df3 = df1.join(df2,["col1", "col2", "col3"])
4条答案
按热度按时间mzaanser1#
我相信实现这一目标的最好方法是改变其中的每一个
key
将列转换为大写或小写(可能创建新列或仅对其应用转换),然后应用联接。nbnkbykc2#
它并不十分优雅,但您可以为这些列创建新的小写版本,只用于连接。
你也可以尝试在连接 predicate 中做同样的转换,例如:
7cjasjjr3#
我这样做:x=y.join(z,lower(y.userid)==lower(z.userid))
csga3l584#
好吧,据我所知,除了一些准备步骤,别无选择。最后我是这样做的: