如何使用pyspark

时间:2017-09-06 15:03:19

标签: apache-spark pyspark apache-spark-sql spark-dataframe pyspark-sql

我已经阅读了镶木地板文件,我想过滤  使用准备好的词典的行。数据框中有两列名为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 个答案:

答案 0 :(得分:3)

因此,您的问题中有两个组成部分:

  1. 字符串列连接
  2. 使用字典过滤
  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'}):< / p>

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

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

    编辑(评论后):将已加入的列与初始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| 
    # +---+---+--------------+