问题描述
在 PySpark 中,我试图清理数据集。 某些列的值中包含不需要的字符 (="")。 我将数据集作为 DataFrame 读取,并且我已经创建了一个可以成功删除字符的用户定义函数,但是现在我正在努力编写一个脚本来识别我需要在哪些列上执行 UserDefinedFunction。 我只使用数据集的最后一行,假设列总是包含相似的条目。
数据帧(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楼
“我只使用数据集的最后一行,假设列总是包含相似的条目。” 在这种假设下,您可以收集一行并测试您要查找的字符是否在其中。
另外请注意,你并不需要一个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|
# +---+---+---+