По моему мнению, лучшим способом может быть объединение двух фреймов данных, и тогда вы можете смоделировать условия в предложении when.Я думаю, что если вы создадите новый столбец с withColumn
, он будет перебирать значения текущего фрейма данных, но я думаю, что вы не сможете получить доступ к значениям из другого фрейма данных и ожидать, что он также будет перебирать все строки там.Следующий код должен выполнить ваш запрос:
df_aa = spark.createDataFrame([
(1,1,0,"ab2", "ac3"),
(1,1,1,"dg6", "jf2"),
(2,1,1,"84d", "kf6"),
(2,2,1,"89m", "k34"),
(3,1,0,"5bd", "nc4")
], ("id1", "id2","nr","cell1","cell2"))
df_bb = spark.createDataFrame([
(1, 1, "x","ab2"),
(1, 1, "a","dg6"),
(2, 1, "b","84d"),
(2, 2, "t","89m"),
(3, 1, "d", "5bd")
], ("a", "b","use","cell"))
cond = (df_bb.cell == df_aa.cell1)|(df_bb.cell == df_aa.cell2)
df_bb.join(df_aa, cond, how="full").withColumn("val1", when((col("id1")==col("id2")) & ((col("cell")==col("cell1"))|(col("cell")==col("cell2"))) & (col("nr")==1), 1).otherwise(0)).withColumn("val2", when(~(col("id1")==col("id2")) & ((col("cell")==col("cell1"))|(col("cell")==col("cell2"))) & (col("nr")==1), 1).otherwise(0)).show()
Результат выглядит так:
+---+---+---+----+---+---+---+-----+-----+----+----+
| a| b|use|cell|id1|id2| nr|cell1|cell2|val1|val2|
+---+---+---+----+---+---+---+-----+-----+----+----+
| 1| 1| x| ab2| 1| 1| 0| ab2| ac3| 0| 0|
| 1| 1| a| dg6| 1| 1| 1| dg6| jf2| 1| 0|
| 2| 1| b| 84d| 2| 1| 1| 84d| kf6| 0| 1|
| 2| 2| t| 89m| 2| 2| 1| 89m| k34| 1| 0|
| 3| 1| d| 5bd| 3| 1| 0| 5bd| nc4| 0| 0|
+---+---+---+----+---+---+---+-----+-----+----+----+
Возможно, мне даже не нужно проверять условие cell==cell1|cell==cell2
, поскольку этов значительной степени условие соединения, но чтобы условия были похожи на ваши, я поставил их там