Spark:如何在df列值中删除不必要的字符

时间:2019-01-27 10:41:21

标签: apache-spark pyspark apache-spark-sql

我有这样的df,

+----+---+
| _c0|_c1|
+----+---+
|('a'| 2)|
|('b'| 4)|
|('c'| 6)|
+----+---+

我想在下面做什么,

+----+---+
| _c0|_c1|
+----+---+
| a  | 2 |
| b  | 4 |
| c  | 6 |
+----+---+

如果我这样尝试得到错误

df1.select(regexp_replace('_c0', "('", "c")).show()
  

调用o789.showString时发生错误。 :   org.apache.spark.SparkException:由于阶段失败,作业中止了:   71.0阶段中的任务1失败1次,最近一次失败:丢失的任务   71.0阶段中的1.0(TID 184,本地主机,执行程序驱动程序):java.util.regex.PatternSyntaxException:索引2附近的未封闭组

2 个答案:

答案 0 :(得分:0)

您应该逃脱括号:

df1.select(regexp_replace('_c0', "\\('", "c")).show()

答案 1 :(得分:0)

就像其他用户所说的那样,必须转义带有反斜杠的特殊字符,例如方括号。 Here可以找到正则表达式特殊字符的列表。以下代码使用两种不同的方法来解决您的问题。使用regexp_extract,提取第二列中(_c0列中'和'之间的单个字符。使用regexp_replace替换第二列中的)。当然,您可以仅将regexp_replace函数与正则表达式“ [()']”配合使用以实现所需的功能。我只想向您展示两种解决问题的方法。

from pyspark.sql import functions as F
columns = ['_c0', '_c1']
vals = [("('a'", "2)"),("('b'", "4)"),("('c'", "6)")]

df = spark.createDataFrame(vals, columns)
df = df.select(F.regexp_extract('_c0', "\('(\w)'", 1).alias('_c0')
             , F.regexp_replace("_c1", "\)", "").alias('_c1'))
df.show()

输出:

+---+---+ 
|_c0|_c1| 
+---+---+ 
|  a|  2| 
|  b|  4| 
|  c|  6| 
+---+---+