【问题标题】:PySpark: list column names based on characters in valuesPySpark:根据值中的字符列出列名
【发布时间】:2019-02-27 21:19:26
【问题描述】:

在 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 很陌生,所以如果这是一个太基本的问题,我深表歉意。非常感谢您的建议!

【问题讨论】:

  • df[x].like('%="') 返回一个不是None 的对象,因此测试总是True。您需要collect()查看内容。

标签: python 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|
# +---+---+---+

【讨论】:

  • 不错的解决方案!不幸的是,'regex_replace' 在 Spark 1.3 上不起作用,但这应该可以。谢谢!
  • 很高兴我能帮上忙。我没有使用该版本的 pyspark 的经验,并且您的 UDF 可能工作得非常好,但是由于您提到您对 pyspark 真的很陌生,因此查看this 以了解未来类似的问题可能会很有趣。
猜你喜欢
  • 2022-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-22
  • 1970-01-01
  • 2020-08-31
  • 1970-01-01
相关资源
最近更新 更多