web-dev-qa-db-ja.com

Pyspark:文字列フォーマットを使用して正規表現でデータフレームをフィルタリングしますか?

「like」演算子を使用して、文字列/式を含む条件でsparkデータフレームをフィルタリングすることに関するいくつかの投稿を読みましたが、以下が「ベストプラクティス」かどうか疑問に思いました次のように、目的の条件で%sを使用する場合:

input_path = <s3_location_str>
my_expr = "Arizona.*hot"  # a regex expression
dx = sqlContext.read.parquet(input_path)  # "keyword" is a field in dx

# is the following correct?
substr = "'%%%s%%'" %my_keyword  # escape % via %% to get "%"
dk = dx.filter("keyword like %s" %substr)

# dk should contain rows with keyword values such as "Arizona is hot."

含む式my_keywordであるdxのすべての行を取得しようとしています。それ以外の場合、完全一致の場合、周囲のパーセント記号「%」は必要ありません。

12
Quetzalcoatl

Neerajのヒントから、pysparkでこれを行う正しい方法は次のようです:

expr = "Arizona.*hot"
dk = dx.filter(dx["keyword"].rlike(expr))

(私のバージョンの)pysparkは$の命名法をサポートしていないようであるため、dx.filter($"keyword" ...)は機能しなかったことに注意してください。

20
Quetzalcoatl

下記のようにrlike関数を試してください。

df.filter(<column_name> rlike "<regex_pattern>")

例えば。

dk = dx.filter($"keyword" rlike "<pattern>")
7
neeraj bhadani

タイムスタンプの正規表現に次を使用しました

expression = r'[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1]) (2[0-3]|[01][0-9]):[0-5][0-9]:[0-5][0-9]'
df1 = df.filter(df['eta'].rlike(expression))
1
Dheeraj