PySpark: сравнивает два Dataframes на основе общего столбца String и генерирует Result Boolean withColumn () - PullRequest
0 голосов
/ 04 февраля 2020

У меня есть два кадра данных ddf_1 и ddf_2, которые имеют общий столбец строковых идентификаторов. Моя цель - создать новый логический столбец is_fine в ddf_1, содержащий True, если идентификатор содержался в ddf_1 и ddf_2, или False, если идентификатор не содержался в ddf_1 и ddf_2.

Рассмотрим данные этого примера:

#### test
#example data
data_1 = { 
    'fruits': ["apples", "banana", "cherry"],
    'myid': ['1-12', '2-12', '3-13'],
    'meat': ["pig", "cow", "chicken"]}

data_2 = { 
    'furniture': ["table", "chair", "lamp"],
    'myid': ['1-12', '0-11', '2-12'],
    'clothing': ["pants", "shoes", "socks"]}

df_1 = pd.DataFrame(data_1)
ddf_1 = spark.createDataFrame(df_1)

df_2 = pd.DataFrame(data_2)
ddf_2 = spark.createDataFrame(df_2)

Я представляю себе функцию примерно так:

def func(df_1, df_2, column_1, column_2):
    if df_1.column_1 != df_2.column_2:
       return df_1.withColumn('is_fact', False)
    else:
        return df_1.withColumn('is_fact', True)
    return df_1

Требуемый вывод должен выглядеть следующим образом:

enter image description here

Ответы [ 3 ]

1 голос
/ 04 февраля 2020

Вы можете выполнить левое внешнее объединение между двумя кадрами данных в столбце my_id и использовать простую инструкцию case для получения столбца is_fine, как показано ниже,

import pyspark.sql.functions as F

ddf_1.join(ddf_2, ddf_1.myid == ddf_2.myid, 'left')\
.withColumn('is_fine', F.when(ddf_2.myid.isNull(), False).otherwise(True))\
.select(ddf_1['fruits'], ddf_1['myid'], ddf_1['meat'], 'is_fine').show()

Вывод:

+------+----+-------+-------+
|fruits|myid|   meat|is_fine|
+------+----+-------+-------+
|cherry|3-13|chicken|  false|
|apples|1-12|    pig|   true|
|banana|2-12|    cow|   true|
+------+----+-------+-------+
0 голосов
/ 05 февраля 2020
#left join ddf2 on ddf1
result = (ddf_1.join(ddf_2, ddf_1.myid == ddf_2.myid, how='left')\
          #create is_fine column
          .withColumn('is_fine', F.when(ddf_2.myid.isNull(), False).otherwise(True)))\
          #select all columns from ddf_1, the new column is_fine and show
          .select(ddf_1["*"], "is_fine").show() 
0 голосов
/ 04 февраля 2020

Воспользуйтесь преимуществом Spark SQL для решения таких проблем:

query = """
select ddf_1.*,
case 
    when ddf_1.myid = ddf_2.myid  then True
    else False 
end as is_fine
from ddf_1 left outer join ddf_2 
on ddf_1.myid = ddf_2.myid
"""

display(spark.sql(query))

Вот вывод

...