我已经在镶木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个组件:
- 字符串列串联
- 使用字典的过滤
关于第一部分 - 这是使用玩具数据框的字符串列串联的示例:
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|
# +---+---+--------------+