Искать ключевое слово во всех столбцах DataFrame и фильтровать - PullRequest
1 голос
/ 26 мая 2020

Мне нужно найти значение во всех столбцах Spark DataFrame.

Я пробовал это;

for col_name in df.columns:
  filter_df = df.where(df[col_name].like('%searchterm%'))

Но в filter_df (filter.df.count() = 0)

Если я протестирую его с именем столбца, которое, как я знаю, содержит ключевое слово, я получу результаты

Ответы [ 3 ]

2 голосов
/ 26 мая 2020

Проблема в том, что при каскадной фильтрации с использованием ваших условий вы в конечном итоге создаете фрейм данных с данными, которые должны удовлетворять каждому условию, как если бы вы объединили условие каждого столбца с AND.

Вы должны построить условие отдельно с помощью OR, например:

cols = df.columns
filt = df[cols[0]].like('%searchterm%')

for col in cols[1:]:
    filt = filt | df[col].like('%searchterm%')

filter_df = df.where(filt)
1 голос
/ 26 мая 2020

Вы можете сделать atleast_one, используя coalesce поверх when столбцов инструкции.

from pyspark.sql import functions as F

df.filter(F.coalesce(*[F.when(F.col(x).like('%searchterm%'),F.lit(1)) for x in df.columns])==1)
0 голосов
/ 26 мая 2020

Проверьте код ниже, получите все столбцы строки типа и создайте условия фильтрации для этих столбцов.

stringCols = map(
  lambda x: x.name,
  filter(
    lambda x: x.dataType.typeName() == 'string',
    df.schema.fields
  )
)# Get all string columns.

expr = reduce(
  lambda x, y: (x | y),
  map(lambda x: col(x).like('%ravi%'), stringCols)
)# Creating expressions, I have used `or`

df = spark.createDataFrame([
    (1, 'srinivas', 'sse'),
    (2, 'ravi', 'engineer'),
    (3, 'Raju', 'ravi se')
  ],
  ['id', 'name', 'designation']
)

df.show()
+---+--------+--------------------+
| id|    name|         designation|
+---+--------+--------------------+
|  1|srinivas|               sse  |
|  2|    ravi|            engineer|
|  3|    Raju|            ravi se |
+---+--------+--------------------+

df.filter(expr).show() # Filter is check 'ravi' value in all string columns.
+---+----+--------------------+
| id|name|         designation|
+---+----+--------------------+
|  2|ravi|            engineer|
|  3|Raju|             ravi se|
+---+----+--------------------+

...