В 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, поэтому извиняюсь, если это слишком простой вопрос. Большое вам спасибо за ваш совет!
"Я использую только последнюю строку набора данных, предполагая, что столбцы всегда содержат похожие записи". В соответствии с этим предположением вы можете собрать одну строку и проверить, находится ли там персонаж, которого вы ищете.
Кроме того, обратите внимание, что вам не нужно использовать 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|
# +---+---+---+
df[x].like('%="')
возвращает объект, который не являетсяNone
поэтому тест всегда равенTrue
. Вам необходимоcollect()
для проверки содержимого.