Объедините 2 кадра данных Spark с неперекрывающимися столбцами - PullRequest
0 голосов
/ 01 августа 2020

У меня есть два фрейма данных, df1:

+---+---------+
| id| col_name|
+---+---------+
|  0|      a  |
|  1|      b  |
|  2|     null|
|  3|     null|
|  4|      e  |
|  5|      f  |
|  6|      g  |
|  7|      h  |
|  8|     null|
|  9|      j  |
+---+---------+

и df2:

+---+---------+
| id| col_name|
+---+---------+
|  0|     null|
|  1|     null|
|  2|        c|
|  3|        d|
|  4|     null|
|  5|     null|
|  6|     null|
|  7|     null|
|  8|        i|
|  9|     null|
+---+---------+

, и я хочу объединить их, чтобы получить

+---+---------+
| id| col_name|
+---+---------+
|  0|        a|
|  1|        b|
|  2|        c|
|  3|        d|
|  4|        e|
|  5|        f|
|  6|        g|
|  7|        h|
|  8|        i|
|  9|        j|
+---+---------+

Я точно знаю, что они не перекрываются (ie, когда запись df2 равна нулю, запись df1 нет, и наоборот)

Я знаю, что если я использую join, я не получу их на одном column и вместо этого получит 2 "col_name". Я просто хочу, чтобы это было в одной колонке. Как мне это сделать? Спасибо

Ответы [ 3 ]

0 голосов
/ 01 августа 2020

Вы можете сделать это:

mydf = df1.copy()                                     #make copy of first array
idx = np.where(df1['col_name'].values == 'null')[0]   #get indices of null
val = df2['col_name'].values[idx]                     #get values from df2 where df1 is null
mydf['col_name'][idx] = val                           #assign those values in mydf
mydf                                                  #print mydf
0 голосов
/ 01 августа 2020

, вы должны иметь возможность использовать функцию coalesce , чтобы достичь этого.

df1 = df1.withColumnRenamed("col_name", "col_name_a")
df2 = df2.withColumnRenamed("col_name", "col_name_b")

joinedDF = renamedDF1.join(renamedDF2, "id")
joinedDF = joinedDF.withColumn(
        "col_name", 
        coalesce(joinedDF.col("col_name_a"), joinedDF.col("col_name_b"))
    )
0 голосов
/ 01 августа 2020

Попробуйте это -

df1.alias("a").join(df2.alias("b"), "id").selectExpr("id", "coalesce(a.col_name, b.col_name) as col_name")
...