pyspark-如何进行不区分大小写的Dataframe连接?

yhuiod9q  于 2021-05-27  发布在  Spark
关注(0)|答案(4)|浏览(405)

在pyspark中有没有好看的代码来执行不区分大小写的join?比如:

df3 = df1.join(df2, 
               ["col1", "col2", "col3"],
               "left_outer",
               "case-insensitive")

或者你的工作方法是什么?

mzaanser

mzaanser1#

我相信实现这一目标的最好方法是改变其中的每一个 key 将列转换为大写或小写(可能创建新列或仅对其应用转换),然后应用联接。

nbnkbykc

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")
7cjasjjr

7cjasjjr3#

我这样做:x=y.join(z,lower(y.userid)==lower(z.userid))

csga3l58

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"])

相关问题