如何解码pyspark数据帧中具有特殊UTF-8字符十六进制编码的字符串

如何解码pyspark数据帧中具有特殊UTF-8字符十六进制编码的字符串,pyspark,pyspark-sql,Pyspark,Pyspark Sql,我有一个类似于下面的pyspark数据帧,其中的特殊字符是十六进制编码的 +--------------------+ |item_name | +--------------------+ |Jogador n\xBA 10 | |Camisa N\xB0 9 | |Uniforme M\xE9dio | +--------------------+ 我需要将其解码为UTF-8字符,如下所示: +--------------------+ |item_

我有一个类似于下面的pyspark数据帧,其中的特殊字符是十六进制编码的

+--------------------+
|item_name           |
+--------------------+
|Jogador n\xBA 10    |
|Camisa N\xB0 9      |
|Uniforme M\xE9dio   |
+--------------------+
我需要将其解码为UTF-8字符,如下所示:

+--------------------+
|item_name           |
+--------------------+
|Jogador nº 10       |
|Camisa N° 9         |
|Uniforme Médio      |
+--------------------+
Pypark解码功能没有区别:

df.withColumn('test', decode(col('item_name'),'UTF-8')).show()

+--------------------+--------------------+
|item_name           |test                |
+--------------------+--------------------+
|Jogador n\xBA 10    |Jogador n\xBA 10    |
|Camisa N\xB0 9      |Camisa N\xB0 9      |
|Uniforme M\xE9dio   |Uniforme M\xE9dio   |
+--------------------+--------------------+

如果十六进制值前面有双反斜杠(例如:\\xBA而不是\xBA),Pyspark将无法正确解码

使用“take(3)”而不是“show()”表明实际上还有第二个反斜杠:

[Row(item_name='Jogador n\\xBA 10'),
 Row(item_name='Camisa N\\xB0 9'),
 Row(item_name='Uniforme M\\xE9dio')]
为了解决这个问题,我创建了一个UDF,使用“unicode转义”方法进行解码:


u“º”.encode(“utf-8”)
'\xc2\xba“
不是
'\xba'
-您确定您的特殊字符编码正确吗?继我之前的评论之后,
spark.sql(“选择解码('\xc2\xb0',utf-8')show()
生成正确的输出(
,如第二行所示)然而
spark.sql(“选择解码('\xb0',UTF-8')作为解码”).show()
不起作用。@pault,我不知道编码为什么会返回这个额外的“\xc2”,但解码的另一种方法\xBA将产生正确的字符:chr(0xBA)=“º”
import pyspark.sql.functions as F
import pyspark.sql.types as T
my_udf = F.udf(lambda x: x.encode().decode('unicode-escape'),T.StringType())
df.withColumn('test', my_udf('item_name')).show()
+------------------+---------------+
|         item_name|           test|
+------------------+---------------+
|  Jogador n\xBA 10|  Jogador nº 10|
|    Camisa N\xB0 9|    Camisa N° 9|
| Uniforme M\xE9dio| Uniforme Médio|
+------------------+---------------+