对Spark 3中的整列应用java函数urldecode.decode

对Spark 3中的整列应用java函数urldecode.decode,java,scala,apache-spark,Java,Scala,Apache Spark,我有一个包含url编码字符串的dataframe列,例如: 我想这样做: someDF.withColumn('newcol', URLDecoder.decode( col("mystring"), "utf-8" )) someDF.show() | mystring | newcol | -------------------------------------------------- |

我有一个包含url编码字符串的dataframe列,例如:

我想这样做:

someDF.withColumn('newcol', URLDecoder.decode( col("mystring"), "utf-8" ))
someDF.show()
|         mystring         |         newcol      |
--------------------------------------------------
| ThisIs%201rstString      | ThisIs 1rstString   |        
| This%20is%3Ethisone      | This is>thisone     |
| and%20so%20one           | and so one          |
我该怎么做呢?我想地图功能就要实现了,但我不知道该怎么做

注意:这是一个示例,它不是创建多个替换语句的选项,因为还有许多其他编码字符,列表可能会有所不同,我想使用一种简单可靠的方法来完成此操作。

创建一个执行此工作的

导入java.net.url解码器
def decode(in:String)=URLDecover.decode(in,“utf-8”)
val decode_udf=udf(decode(udf))
df.withColumn(“newcol”,decode_udf('mystring)).show()

打印预期结果。

您可以尝试SparkSQL内置函数:

反射(类,方法[,arg1[,arg2..]])-调用具有反射的方法


注意:以上是Python代码,您应该能够对Scala执行相同的操作。

定义UDF有什么主要区别吗?简而言之,内置函数简单且开销较小,UDF没有矢量化,通常性能较低。这个链接列出了与PySpark UDF相比的一些要点,但也包括Scala/Java。好吧,有趣的是,我从来没有使用过
PySpark
,原因有几个,一个是因为它是
python
,两个是因为我知道
PySpark
的性能受到了影响,尽管在SPARK 3中有所降低,在这种情况下,我宁愿使用纯scala,但
reflect
函数似乎只在SQL中可用。是的,pyspark不能直接使用它(不确定scala/Java),但您可以使用
expr(“reflect(…))
访问它。虽然它很好,但会增加巨大的性能影响,我会试着找一些轻一点的。
df = spark.createDataFrame([(e,) for e in ["ThisIs%201rstString", "This%20is%3Ethisone", "and%20so%20one"]], ["mystring"])

df.selectExpr("*", "reflect('java.net.URLDecoder','decode', mystring, 'utf-8') as newcol").show()

+-------------------+-----------------+
|           mystring|           newcol|
+-------------------+-----------------+
|ThisIs%201rstString|ThisIs 1rstString|
|This%20is%3Ethisone|  This is>thisone|
|     and%20so%20one|       and so one|
+-------------------+-----------------+