PySpark: список имен столбцов на основе символов в значениях - PullRequest
0 голосов
/ 24 сентября 2018

В 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, поэтому приношу свои извинения, если это слишком простой вопрос.Заранее большое спасибо за совет!

1 Ответ

0 голосов
/ 24 сентября 2018

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

Также обратите внимание, что вам не нужно 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|
# +---+---+---+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...