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

Bab*_*abu 8 apache-spark apache-spark-sql pyspark

有没有漂亮的代码可以在 Pyspark 中执行不区分大小写的连接?就像是:

df3 = df1.join(df2, 
               ["col1", "col2", "col3"],
               "left_outer",
               "case-insensitive")
Run Code Online (Sandbox Code Playgroud)

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

Chr*_*ove 9

它并不完全优雅,但您可以纯粹为了连接而创建这些列的新小写版本。

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")
Run Code Online (Sandbox Code Playgroud)

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

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")
Run Code Online (Sandbox Code Playgroud)


Alb*_*nto 4

我认为实现此目的的最佳方法是将这些key列中的每一列转换为大写小写(可能创建新列或仅对它们应用该转换),然后应用联接。