【问题标题】:Apply java funciton URLDecoder.decode to whole column in Spark 3将 java 函数 URLDecoder.decode 应用于 Spark 3 中的整个列
【发布时间】:2020-12-28 01:47:36
【问题描述】:

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

我想做这样的事情:

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 scala apache-spark


    【解决方案1】:

    你可以试试 SparkSQL 内置函数reflect:

    reflect(class, method[, arg1[, arg2 ..]]) - 使用反射调用方法。

    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|
    +-------------------+-----------------+
    

    注意:以上是 Python 代码,你应该可以用 Scala 做同样的事情。

    【讨论】:

    • 与定义 UDF 有很大不同吗?
    • 简而言之,内置函数简单且开销较小,UDF 未矢量化且通常性能较低。此链接stackoverflow.com/questions/38296609 列出了与 PySpark UDF 相比的一些要点,但也包括 Scala/Java。
    • 好吧,有趣,我从不使用pyspark有几个原因,一是因为它是python,二是因为我知道pyspark的性能虽然在SPARK 3中有所降低,但在这种情况下我宁愿使用纯 scala 但reflect 函数似乎只在 SQL 中可用。
    • 是的,pyspark 不能直接使用它(不确定 Scala/Java),不过您可以使用 expr("reflect(......)") 访问它。
    【解决方案2】:

    创建一个执行工作的UDF

    import java.net.URLDecoder
    def decode(in:String) =  URLDecoder.decode(in, "utf-8")
    val decode_udf = udf(decode(_))
    df.withColumn("newcol", decode_udf('mystring)).show()
    

    打印预期结果。

    【讨论】:

    • 不错,它确实有效,但会增加巨大的性能影响,我会尝试寻找不那么繁重的东西。
    猜你喜欢
    • 2016-11-29
    • 2016-05-15
    • 1970-01-01
    • 1970-01-01
    • 2017-10-18
    • 2021-07-01
    • 1970-01-01
    • 2016-02-26
    • 1970-01-01
    相关资源
    最近更新 更多