您知道如何解码 PySpark 中下面的“营销活动”列吗?该列中的记录是 URL 格式的字符串:
+--------------------+------------------------+
|user_id |campaign |
+--------------------+------------------------+
|alskd9239as23093 |MM+%7C+Cons%C3%B3rcios+%|
|lfifsf093039388 |Aquisi%C3%A7%C3%A3o+%7C |
|kasd877191kdsd999 |Aquisi%C3%A7%C3%A3o+%7C |
+--------------------+------------------------+
我知道可以使用 Python 中的
urllib
库来做到这一点。但是,我的数据集很大,将其转换为 pandas 数据框需要很长时间。如何使用 Spark DataFrame 做到这一点?
无需转换为中间pandas数据帧,您可以使用pyspark用户定义函数(udf)来
unquote
引用的字符串:
from urllib.parse import unquote
df.withColumn('campaign', F.udf(unquote, F.StringType())('campaign'))
如果
null
列中有 campaign
值,则必须在取消引用字符串之前进行 null 检查:
f = lambda s: unquote(s) if s else s
df.withColumn('campaign', F.udf(f, F.StringType())('campaign'))
+-----------------+-----------------+
| user_id| campaign|
+-----------------+-----------------+
| alskd9239as23093|MM+|+Consórcios+%|
| lfifsf093039388| Aquisição+||
|kasd877191kdsd999| Aquisição+||
+-----------------+-----------------+
这些应该有效:
星火3.5+
F.url_decode('campaign')
星火3.4+
F.expr("url_decode(campaign)")
但是,Spark 表示您的值“MM+%7C+Cons%C3%B3rcios+%”格式不正确:
[CANNOT_DECODE_URL] 提供的 URL 无法解码:MM+%7C+Cons%C3%B3rcios+%。请确保 URL 格式正确,然后重试。
当我尝试不使用该行时,它会起作用:
from pyspark.sql import functions as F
df = spark.createDataFrame(
[('lfifsf093039388', 'Aquisi%C3%A7%C3%A3o+%7C'),
('kasd877191kdsd999', 'Aquisi%C3%A7%C3%A3o+%7C')],
['user_id', 'campaign'])
df.withColumn('campaign', F.url_decode('campaign')).show()
# +-----------------+-----------+
# | user_id| campaign|
# +-----------------+-----------+
# | lfifsf093039388|Aquisição ||
# |kasd877191kdsd999|Aquisição ||
# +-----------------+-----------+