对Spark 3中的整列应用java函数urldecode.decode
我有一个包含url编码字符串的dataframe列,例如: 我想这样做:对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 | -------------------------------------------------- |
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|
+-------------------+-----------------+