Pyspark изменить значение столбца, если значение из списка находится в другом столбце - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть такой фрейм данных:

+-------+----------------+
|Name   |Source          |
+-------+----------------+
|Tom    |clientA-incoming|
|Dick   |clientB-incoming|
|Harry  |c-abc-incoming  |

, и я хотел бы добавить столбец slug, чтобы получить этот фрейм данных:

+-------+----------------+--------+
|Name   |Source          |slug    |
+-------+----------------+--------+
|Tom    |clientA-incoming|clientA |
|Dick   |clientB-incoming|clientB |
|Harry  |c-abc-incoming  |c-abc   |

, и у меня есть список значений, в которых есть слагы:

slugs = ['clientA', 'clientB', 'c-abc']

в основном я думаю о чем-то вроде этого псевдокода:

for i in slugs:
    if i in df['Source']:
        df['Slug'] = i

может кто-нибудь помочь мне пересечь строка фини sh?

РЕДАКТИРОВАТЬ:

Я хочу обновить столбец slug со значением из списка slugs. Значение спецификатора c, которое входит в столбец slug, определяется на основе столбца Source.

Например, поскольку slugs[0] = 'clientA' и clientA являются подстрокой clientA-incoming, я бы хотел обновить значение этой строки в столбце slug до clientA

1 Ответ

2 голосов
/ 21 февраля 2020

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

from pyspark.sql.functions import broadcast

slugs = ['clientA', 'clientB', 'c-abc', 'f-gd']
sdf = spark.createDataFrame(slugs, "string").withColumnRenamed("value", "slug")

df = spark.createDataFrame([
  ["Tom", "clientA-incoming"],
  ["Dick", "clientB-incoming"],
  ["Harry", "c-abc-incoming"],
  ["Harry", "c-dgl-incoming"]
], ["Name", "Source"])

df.join(broadcast(sdf), df["Source"].contains(sdf["slug"]), "left").show()

# +-----+----------------+-------+
# | Name|          Source|   slug|
# +-----+----------------+-------+
# |  Tom|clientA-incoming|clientA|
# | Dick|clientB-incoming|clientB|
# |Harry|  c-abc-incoming|  c-abc|
# |Harry|  c-dgl-incoming|   null|
# +-----+----------------+-------+

Обратите внимание, что мы передаем меньший df для предотвращения перетасовки.

...