PySpark: список имен столбцов на основе символов в значениях

1

В PySpark я пытаюсь очистить набор данных. В некоторых столбцах в нем есть нежелательные символы (= ""). Я прочитал набор данных как DataFrame, и я уже создал пользовательскую функцию, которая может успешно удалить символы, но теперь я изо всех сил пытаюсь написать сценарий, который может определить, в каких столбцах мне нужно выполнить UserDefinedFunction. Я использую только последнюю строку набора данных, предполагая, что в столбцах всегда содержатся похожие записи.

DataFrame (df):

      id  value1   value2   value3    
="100010"     10       20    ="30"

В Python следующие работы:

columns_to_fix = []    
for col in df:
    value = df[col][0]
    if type(value) == str and value.startswith('='):
        columns_to_fix.append(col)   

Я попробовал следующее в PySpark, но это возвращает все имена столбцов:

columns_to_fix = []    
for x in df.columns:
    if df[x].like('%="'):
        columns_to_fix.append(x)

Желаемый результат:

columns_to_fix: ['id', 'value3']

Как только у меня есть имена столбцов в списке, я могу использовать цикл for для фиксации записей в столбцах. Я очень новичок в PySpark, поэтому извиняюсь, если это слишком простой вопрос. Большое вам спасибо за ваш совет!

  • 2
    df[x].like('%="') возвращает объект, который не является None поэтому тест всегда равен True . Вам необходимо collect() для проверки содержимого.
Теги:
pyspark

1 ответ

1
Лучший ответ

"Я использую только последнюю строку набора данных, предполагая, что столбцы всегда содержат похожие записи". В соответствии с этим предположением вы можете собрать одну строку и проверить, находится ли там персонаж, которого вы ищете.

Кроме того, обратите внимание, что вам не нужно использовать udf для замены = в ваших столбцах, вы можете использовать regexp_replace. Ниже приведен рабочий пример, надеюсь, что это поможет!

import pyspark.sql.functions as F

df = spark.createDataFrame([['=123','456','789'], ['=456','789','123']], ['a', 'b','c'])
df.show()

# +----+---+---+
# |   a|  b|  c|
# +----+---+---+
# |=123|456|789|
# |=456|789|123|
# +----+---+---+

# list all columns with '=' in it.
row = df.limit(1).collect()[0].asDict()
columns_to_replace = [i for i,j in row.items() if '=' in j]

for col in columns_to_replace:
    df = df.withColumn(col, F.regexp_replace(col, '=', ''))

df.show()

# +---+---+---+
# |  a|  b|  c|
# +---+---+---+
# |123|456|789|
# |456|789|123|
# +---+---+---+
  • 0
    Отличное решение! «Regex_replace», к сожалению, не работает на Spark 1.3, но это должно сработать. Спасибо!
  • 1
    Рад, что смог помочь. У меня нет опыта работы с этой версией pyspark, и, вероятно, ваш UDF работает отлично, но, поскольку вы упоминаете, что вы действительно новичок в pyspark, было бы интересно взглянуть на это для будущих проблем, которые похожи.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню