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  |
    # +----+-----+---+