Pyspark - 如何处理不区分大小写的数据帧连接?

时间:2016-10-25 15:51:31

标签: apache-spark pyspark spark-dataframe

是否有任何漂亮的代码在Pyspark中执行不区分大小写的连接? 类似的东西:

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

或者你的工作解决方案是什么?

4 个答案:

答案 0 :(得分:2)

它并不完全优雅,但你可以创建纯粹用于加入的那些列的新小写版本。

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

你也可以尝试在连接谓词中进行相同的转换,例如:

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

答案 1 :(得分:1)

我认为实现这一目标的最佳方法是将每个key列转换为小写(可能会创建新列或仅应用该列转换它们,然后应用连接。

答案 2 :(得分:0)

嗯,据我所知,除了一些预备步骤之外别无选择。我最后这样做了:

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

答案 3 :(得分:0)

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