如何使用Pyspark中的两列串联过滤



我已经在镶木quet文件中阅读了,我想过滤 使用准备好的dict行。数据框中有两个称为col1和col2的列,它们是类型字符串。我的词典中有一组字符串,我想要行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)

做到这一点的正确方法是什么?

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

  1. 字符串列串联
  2. 使用字典的过滤

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

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

相关内容

  • 没有找到相关文章

最新更新