Пересечение двух фреймов данных с разными столбцами в Pyspark - PullRequest
0 голосов
/ 04 мая 2020

Я новичок в Data Science и работаю над простым самостоятельным проектом с использованием Google Colab. Я взял данные из файла something1.csv и something2.csv.

df1 = spark.read.csv('something1.csv', header=True)
df2 = spark.read.csv('something2.csv', header=True)

Данные something1.csv выглядят как

#+----------+---------+----------+--------+-------+
#|   country| Latitude| Longitude|   col1 |  col2 |
#+----------+---------+----------+--------+-------+
#|   Andorra|   42.506|    1.5218|    2   |   1   |
#| Australia|   -31.81|    115.86|    1   |   6   |
#|   Austria|   41.597|    12.580|    4   |   9   |
#|   Belgium|   21.782|     1.286|    2   |   3   |
#|     India|   78.389|    12.972|    1   |   7   |
#|   Ireland|    9.281|     9.286|    9   |   8   |
#|       USA|   69.371|    21.819|    7   |   2   |
#+----------+---------+----------+--------+-------+

Данные something2.csv выглядят как

#+----------+---------+----------+--------+-------+
#|   country| Latitude| Longitude|   col1 |  col2 |
#+----------+---------+----------+--------+-------+
#| Australia|   -31.81|    115.86|    2   |   6   |
#|   Belgium|   21.782|     1.286|    1   |   6   |
#|     India|   78.389|    12.972|    3   |   5   |
#|       USA|   69.371|    21.819|    2   |   5   |
#+----------+---------+----------+--------+-------+

Теперь я хочу пересечь df2 с df1 на основе Longitude и Latitude и получить строки, которые присутствуют в df1 вместе с col1 и col2 из df1. Моя таблица должна выглядеть так:

#+----------+---------+----------+--------+-------+
#|   country| Latitude| Longitude|   col1 |  col2 |
#+----------+---------+----------+--------+-------+
#| Australia|   -31.81|    115.86|    1   |   6   |
#|   Belgium|   21.782|     1.286|    2   |   3   |
#|     India|   78.389|    12.972|    1   |   7   |
#|       USA|   69.371|    21.819|    7   |   2   |
#+----------+---------+----------+--------+-------+

Я пытался использовать следующий код, но не работал.

new_df =  df1.intersect(df2) #using the intersection in pyspark which gave me null table

Затем я также пытался на основе Latitude и Longitude

new_df = df2.select('Latitude','Longitude').intersect(df1.select('Latitude','Logitude')) #intersecting based on columns

Я попробовал оба вышеописанных метода в pyspark, но не сработал.

1 Ответ

2 голосов
/ 04 мая 2020

Intersect получает только те строки, которые являются общими для обоих фреймов данных.

  • Но в вашем случае вам нужно col1,col2 из df1 и другие столбцы из df2, присоединитесь к фреймам данных (слева / внутрь по требованию) и выберите только col1,col2 из df1 и другие столбцы из df2.

  • (или) Как указано в комментариях Mohammad Murtaza Hashmi Использование left_semi присоединение

Example:

#using left semi join
df1.join(df2,['Latitude','Longitude'],'left_semi').show()

#using left join
df2.alias("t2").join(df1.alias("t1"),['Latitude','Longitude'],'left').select("t2.country","t2.Latitude","t2.Longitude","t1.col1","t1.col2").show()
#+---------+--------+---------+----+----+
#|  country|Latitude|Longitude|col1|col2|
#+---------+--------+---------+----+----+
#|Australia|  -31.81|   115.86|   1|   6|
#|  Belgium|  21.782|    1.286|   2|   3|
#|    India|  78.389|   12.972|   1|   7|
#|      USA|  69.371|   21.819|   7|   2|
#+---------+--------+---------+----+----+

Dynamic way:

#join columns
join_cols=[x for x in df1.columns if x.startswith("L")]

#selecting cols from t1
t1_cols=["t1."+x for x in df1.columns if x.startswith("col")]

#selecting cols from t2
t2_cols=["t2."+x for x in df2.columns if not x.startswith("col")]

df2.alias("t2").join(df1.alias("t1"),['Latitude','Longitude'],'inner').select(*t2_cols + t1_cols).show()

#+---------+--------+---------+----+----+
#|  country|Latitude|Longitude|col1|col2|
#+---------+--------+---------+----+----+
#|Australia|  -31.81|   115.86|   1|   6|
#|  Belgium|  21.782|    1.286|   2|   3|
#|    India|  78.389|   12.972|   1|   7|
#|      USA|  69.371|   21.819|   7|   2|
#+---------+--------+---------+----+----+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...