0

私は寄木細工のファイルを読み込んでおり、準備されたdictを使用して の行をフィルタリングしたいと思います。データフレームには、col1とcol2という2つの列があり、それぞれstring型です。私の辞書には文字列があり、col1とcol2の文字列の連結が辞書にある行が必要です。私はpysparkの2つの列を連結してフィルタリングする方法

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

内容に関係なく、 'df ['col1']'と 'df ['col2']'は 'pyspark.sql.column.Column'型であり、型文字列ではありません – desertnaut

答えて

3

だから、あなたの問題で2つのコンポーネントがあります。

  1. 文字列の連結
  2. は、最初の部分に関しては辞書

を使用してフィルタリング - ここでは、文字列の列の一例ですおもちゃのデータフレームを使用した連結:

01251641これは十分に便利です

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

希望を..:わからない、それは辞書で動作しますが、それは間違いなくリスト(['foo 1', 'foo 2'])またはセット({'foo 1', 'foo 2'})で動作します - 第二部については

、あなたは.isin方法を必要とします。

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

ありがとうございます。 'df2 = df.select(concat(col(" k ")、lit(" ")、col(" v "))。別名( 'joined_colname'))' df'の他の列もすべて保持しますか? – eleanora

+0

@eleanora 'withColumn'を呼び出す必要があります - 編集を参照してください – desertnaut

関連する問題