2016-10-25 3 views

ответ

1

Я считаю, что лучший способ добиться этого путем преобразования каждого из этих key столбцов верхней или строчными (возможно создание новых столбцов или просто применять эти преобразования над ними), а затем применить соединения.

1

Это не совсем элегантно, но вы можете создавать новые версии в нижнем регистре этих столбцов исключительно для соединения.

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") 
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"]) 
Смежные вопросы