Python Pyspark筛选列表列中的项目
我正在尝试过滤数据帧中的数据。数据框Python Pyspark筛选列表列中的项目,python,dataframe,filter,pyspark,Python,Dataframe,Filter,Pyspark,我正在尝试过滤数据帧中的数据。数据框df有两列-query+href。在一行中:query是随机字符串,href是字符串列表。我有另一个名为url的列表,带有字符串 正在从href列列表中的列表URL中查找URL+URL在href列表中的位置。我正在尝试df.filter(col(“href”)).isin(url),但是pyspark抱怨这个列表我无法完成。收集()bc的数据量 提前谢谢 基本上应该是这样的,但我不确定如何在pyspark中实现: for url in urls: if
df
有两列-query
+href
。在一行中:query
是随机字符串,href
是字符串列表。我有另一个名为url
的列表,带有字符串
正在从href
列列表中的列表URL
中查找URL+URL在href
列表中的位置。我正在尝试df.filter(col(“href”)).isin(url)
,但是pyspark抱怨这个列表我无法完成。收集()bc的数据量
提前谢谢
基本上应该是这样的,但我不确定如何在pyspark中实现:
for url in urls:
if url in "href item list":
print(query + url + "href item list".index(url)) # doesn't matter if index or position
else:
pass
例如:
urls = [url1, url2, url3, url4, url5, url6, url7, url8]
query | href
------------
q1 | [url7, url11, url12, url13, url14]
q2 | [url1, url3, url5, url6]
q3 | [url1, url2, url8]
Output should look like
q2 - url1 - 0
q3 - url1 - 0
q3 - url2 - 1
q2 - url3 - 1
q2 - url5 - 2
q2 - url6 - 3
q1 - url7 - 0
q3 - url8 - 2
步骤如下:
分解
列href
筛选那些具有已知URL的行
收集结果并在URL
ss
的SparkSession
对象,我们可以像这样重新创建原始数据帧:
df = ss.createDataFrame(
[
("q1", ["url7", "url11", "url12", "url13", "url14"]),
("q2", ["url1", "url3", "url5", "url6"]),
("q3", ["url1", "url2", "url8"]),
],
["query", "href"],
)
urls = ["url1", "url2", "url3", "url4", "url5", "url6", "url7", "url8"]
现在,我们应用前面描述的步骤:
import pyspark.sql.functions as sf
# Exploding the column "href".
exp_df = df.select("query", sf.explode(sf.col("href")).alias("href_sing"))
# Checking if the URL in the DataFrame exists in "urls".
# I suggest to convert "urls" into a "set" before this step: "set(urls)". It might
# improve the performance of "isin", but this is just an optional optimization.
known_df = exp_df.select("*", sf.col("href_sing").isin(urls).alias("is_known"))
# Discard unknown URLs.
true_df = true_df = known_df.filter("is_known = True")
# The final results.
res = [
(r["query"], r["href_sing"], urls.index(r["href_sing"]))
for r in true_df.collect()
]
检查某些值:
In [18]: df.show()
+-----+--------------------+
|query| href|
+-----+--------------------+
| q1|[url7, url11, url...|
| q2|[url1, url3, url5...|
| q3| [url1, url2, url8]|
+-----+--------------------+
In [19]: exp_df.show()
+-----+---------+
|query|href_sing|
+-----+---------+
| q1| url7|
| q1| url11|
| q1| url12|
| q1| url13|
| q1| url14|
| q2| url1|
| q2| url3|
| q2| url5|
| q2| url6|
| q3| url1|
| q3| url2|
| q3| url8|
+-----+---------+
In [20]: true_df.show()
+-----+---------+--------+
|query|href_sing|is_known|
+-----+---------+--------+
| q1| url7| true|
| q2| url1| true|
| q2| url3| true|
| q2| url5| true|
| q2| url6| true|
| q3| url1| true|
| q3| url2| true|
| q3| url8| true|
+-----+---------+--------+
In [23]: res
Out[23]:
[('q1', 'url7', 6),
('q2', 'url1', 0),
('q2', 'url3', 2),
('q2', 'url5', 4),
('q2', 'url6', 5),
('q3', 'url1', 0),
('q3', 'url2', 1),
('q3', 'url8', 7)]
我建议1)使用explode
为您的URL创建一个单列数据框,2)使用posexplode
为您的查询、href和href的索引位置创建三列数据框,然后3)内部连接这两个数据框
创建URL的数据帧
创建您提供的示例数据
解决方案
我想你不需要在这里收款。你在用spark2.4吗?
from pyspark.sql.functions import explode, posexplode
urls = [
(['url1', 'url2', 'url3', 'url4', 'url5', 'url6', 'url7', 'url8'],),
]
refs = (
spark.createDataFrame(urls, ['ref']).
select(
explode('ref')
)
)
refs.show(truncate=False)
# +----+
# |col |
# +----+
# |url1|
# |url2|
# |url3|
# |url4|
# |url5|
# |url6|
# |url7|
# |url8|
# +----+
data = [
("q1", ["url7", "url11", "url12", "url13", "url14"]),
("q2", ["url1", "url3", "url5", "url6"]),
("q3", ["url1", "url2", "url8"]),
]
df = spark.createDataFrame(data, ["query", "href"])
df.show(truncate=False)
# +-----+----------------------------------+
# |query|href |
# +-----+----------------------------------+
# |q1 |[url7, url11, url12, url13, url14]|
# |q2 |[url1, url3, url5, url6] |
# |q3 |[url1, url2, url8] |
# +-----+----------------------------------+
(
df.
select(
'query',
posexplode('href')
).
join(
refs,
'col',
'inner'
).
orderBy('col', 'query').
show(truncate=False)
)
# +----+-----+---+
# |col |query|pos|
# +----+-----+---+
# |url1|q2 |0 |
# |url1|q3 |0 |
# |url2|q3 |1 |
# |url3|q2 |1 |
# |url5|q2 |2 |
# |url6|q2 |3 |
# |url7|q1 |0 |
# |url8|q3 |2 |
# +----+-----+---+