首页 文章

如何在pyspark中使用两列的串联进行过滤

提问于
浏览
0

我已经阅读了一个镶木地板文件,我想用准备好的dict过滤行 . 数据框中有两列名为col1和col2,它们是string类型 . 我的字典中有一组字符串,我想要一些行,其中列col1和col2中字符串的串联在字典中 . 我试过了

df.filter((df['col1']+df['col2']) in my_dict)

但似乎 df['col1']+df['col2'] 不是字符串,即使这是列的类型 .

我也试过了

df.filter(lambda x: (x['col1']+df['col2']) in my_dict)

这样做的正确方法是什么?

1 回答

  • 3

    因此,您的问题中有两个组件:

    • 字符串列连接

    • 使用字典过滤

    关于第一部分 - 这是使用玩具数据帧的字符串列连接的示例:

    spark.version
    # u'2.1.1'
    
    from pyspark.sql.functions import concat, col, lit
    df = spark.createDataFrame([("foo", 1), ("bar", 2)], ("k", "v"))
    df.show()
    # +---+---+
    # |  k|  v|
    # +---+---+
    # |foo|  1|
    # |bar|  2|
    # +---+---+
    
    df2 = df.select(concat(col("k"), lit(" "), col("v")).alias('joined_colname'))
    df2.show()
    # +--------------+ 
    # |joined_colname|
    # +--------------+
    # |         foo 1|
    # |         bar 2|
    # +--------------+
    

    关于第二部分,你需要 .isin 方法 - 不确定它是否适用于字典,但它肯定适用于列表( ['foo 1', 'foo 2'] )或集合( {'foo 1', 'foo 2'} ):

    df2.filter(col('joined_colname').isin({'foo 1', 'foo 2'})).show() # works with lists, too
    # +--------------+
    # |joined_colname| 
    # +--------------+
    # |         foo 1|
    # +--------------+
    

    希望这足够有用......

    EDIT (评论后):将连接列与初始 df 的列保持在一起:

    df3 = df.withColumn('joined_colname', concat(col("k"), lit(" "), col("v")))
    df3.show()
    # +---+---+--------------+ 
    # |  k|  v|joined_colname| 
    # +---+---+--------------+
    # |foo|  1|         foo 1|
    # |bar|  2|         bar 2| 
    # +---+---+--------------+
    

相关问题