I have a dataframe like this:
| FLAG | DATA |
|---|---|
| S | D1 |
| S | D2 |
| S | D3 |
| S | SP |
| N | D5 |
| N | D2 |
| N | D6 |
| N | SP |
Now I need to follow some instructions. They are:
- Get dataframe where FLAG is S.
- Get dataframe where FLAG is N.
- On a new dataframe, first add all data from dataframe1 (data with FLAG S). Then, take only those rows from the dataframe2 (data with FLAG N), whose DATA value is not in dataframe1.
- The only exception of point 3 is where DATA value is SP. If datafram2 has SP, it will be added to the new dataframe. For SP, no need to check the dataframe1 for addition.
Illustrations:
- DataFrame 1
| FLAG | DATA |
|---|---|
| S | D1 |
| S | D2 |
| S | D3 |
| S | SP |
- DataFrame 2
| FLAG | DATA |
|---|---|
| N | D5 |
| N | D2 |
| N | D6 |
| N | SP |
- DataFrame 3
| FLAG | DATA |
|---|---|
| S | D1 |
| S | D2 |
| S | D3 |
| S | SP |
| N | D5 |
| N | D6 |
| N | SP |
N D2 is eliminated because DATA D2 is already present for FLAG S. But, SP is present for both N and S.
I tried this code snippet:
import pyspark.sql.functions as F
all_data = final_df.select("FLAG", "DATA")
sf_DATA_set = set()
for data in all_data:
if data["FLAG"] == 'S' and data["DATA"] != 'SP':
sf_DATA_set.add(data["DATA"]) # Make a set of all DATA where FLAG is S except SP
df1 = final_df.filter("FLAG='S'")
df2 = final_df.filter("FLAG='N'")
df4 = df2.filter(~F.col("DATA").isin(tuple(sf_DATA_set)) # Getting only those fields from df2 whose DATA value isn't present in sf_DATA_set.
final_df = df4.unionByName(df1)
display(final_df.select(['FLAG', 'DATA']))
But this part isn't working properly.
df4 = df2.filter(~F.col("DATA").isin(tuple(sf_DATA_set))
How can I filter out the data from datafram2?