Pyspark - элемент столбца в списке других столбцов - PullRequest
2 голосов
/ 10 апреля 2020

Я новичок ie в pyspark, и я ищу, чтобы найти элемент column1 в списке column2. Давайте иметь пример.

Давайте рассмотрим простой пример с поиском Google - 3 столбца - query - строка, hrefs - список и clicked_url - строка, и мне нужно проверить, есть ли clicked_url в hrefs.

Существует 3 возможных сценария ios, которые могут произойти:

Если clicked_url находится в списке hrefs, ТО сохраните строку

Если clicked_url отсутствует в списке hrefs, ТО отфильтруйте этот ряд - убрать. (вы можете представить это как клик по объявлению)

Если clicked_url пуст (не было clicked_url), ТО оставьте строку, но измените значение clicked_url на 0.

query  |    hrefs       | clicked_url 
------------------------------------
car    |[url1,...url10] | url1
monkey |[url11,...url20]| url11
mouse  |[url21,...url30]| url11
donkey |[url31,...url40]| "" - empty string
ball   |[url41,...url50]| url45
monkey |[url11,...url20]| url1

Desired вывод:

query  |    hrefs       | clicked_url 
------------------------------------
car    |[url1,...url10] | url1
monkey |[url11,...url20]| url11
donkey |[url31,...url40]| 0
ball   |[url41,...url50]| url45

Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 10 апреля 2020

Pyspark способ сделать это :

Для array_contains вам просто нужно использовать выражение F.expr, чтобы иметь возможность Чтобы отправить деталь value в виде столбца.

from pyspark.sql import functions as F
df.withColumn("clicked_url", F.when(F.col("clicked_url")=="", F.lit(0)).otherwise(F.col("clicked_url")))\
  .withColumn("boolean", F.expr("""array_contains(hrefs,clicked_url)"""))\
  .filter("boolean=true or clicked_url=0").drop("boolean").show()

+------+--------------------+-----------+
| query|               hrefs|clicked_url|
+------+--------------------+-----------+
|   car|       [url1, url10]|       url1|
|monkey|      [url11, url20]|      url11|
|donkey|      [url31, url40]|          0|
|  ball|[url41, url45, ur...|      url45|
+------+--------------------+-----------+

Как .filter также можно принять expression, вы можно ввести только array_contains.

from pyspark.sql import functions as F
df.withColumn("clicked_url", F.when(F.col("clicked_url")=="", F.lit(0))\
              .otherwise(F.col("clicked_url")))\
  .filter("array_contains(hrefs,clicked_url)=true or clicked_url=0").show()

+------+--------------------+-----------+
| query|               hrefs|clicked_url|
+------+--------------------+-----------+
|   car|       [url1, url10]|       url1|
|monkey|      [url11, url20]|      url11|
|donkey|      [url31, url40]|          0|
|  ball|[url41, url45, ur...|      url45|
+------+--------------------+-----------+
2 голосов
/ 10 апреля 2020

Попробуйте это:

df.createTempView('data')
new_df = spark.sqlContext.sql("""
select query
       , hrefs
       , case when clicked_url='' then '0' else clicked_url end as clicked_url
from data
where array_contains(hrefs, clicked_url) or clicked_url=''
""")
new_df.show()
...