如何解码 URL 格式的列?

问题描述 投票:0回答:2

您知道如何解码 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 做到这一点?

dataframe apache-spark pyspark decode urldecode
2个回答
2
投票

无需转换为中间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+||
+-----------------+-----------------+

0
投票

这些应该有效:

星火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 ||
# +-----------------+-----------+
© www.soinside.com 2019 - 2024. All rights reserved.