如何解码在 pyspark 数据帧中具有十六进制编码的特殊 UTF-8 字符的字符串
How to decode strings that have special UTF-8 characters hex encoded in a pyspark dataframe
我有一个像下面这样的 pyspark DataFrame,其中的特殊字符已经过十六进制编码。
+--------------------+
|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 |
+--------------------+
Pyspark 解码函数没有区别:
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-escape" 方法进行解码:
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|
+------------------+---------------+
我有一个像下面这样的 pyspark DataFrame,其中的特殊字符已经过十六进制编码。
+--------------------+
|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 |
+--------------------+
Pyspark 解码函数没有区别:
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-escape" 方法进行解码:
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|
+------------------+---------------+