【问题标题】:How to use Pandas UDF Functionality in pyspark如何在 pyspark 中使用 Pandas UDF 功能
【发布时间】:2019-02-23 08:57:52
【问题描述】:

我有一个包含两列的火花框架,如下所示:

+-------------------------------------------------------------+------------------------------------+
|docId                                                        |id                                  |
+-------------------------------------------------------------+------------------------------------+
|DYSDG6-RTB-91d663dd-949e-45da-94dd-e604b6050cb5-1537142434000|91d663dd-949e-45da-94dd-e604b6050cb5|
|VAVLS7-RTB-8e2c1917-0d6b-419b-a59e-cd4acc255bb7-1537142445000|8e2c1917-0d6b-419b-a59e-cd4acc255bb7|
|VAVLS7-RTB-c818dcde-7a68-4c1e-9cc4-c841660732d2-1537146854000|c818dcde-7a68-4c1e-9cc4-c841660732d2|
|IW2BYL-RTB-E9727F7D-D1BA-479C-9D3A-931F87E78B0A-1537146572000|E9727F7D-D1BA-479C-9D3A-931F87E78B0A|
|DYSDG6-RTB-f50f79e9-3ec3-4bd8-8e53-f62c3f80bcb0-1537146220000|f50f79e9-3ec3-4bd8-8e53-f62c3f80bcb0|
+-------------------------------------------------------------+------------------------------------+

我有一个将 id 列转换为 85 位编码字符串的函数:

def convert_id(id):
    import base64 as bs
    id_str = str(id).replace("-", "") 
    return str(bs.a85encode(bytearray.fromhex(id_str)))[2:-1]

我想使用据报道比普通 udf 更快的 pandas udf 对其进行转换。

我怎样才能做到这一点? TIA。

【问题讨论】:

  • udf 定义是一样的,假设输入和输出将被指定为一个熊猫系列的字符串

标签: python python-3.x pandas pyspark user-defined-functions


【解决方案1】:

完成。 简单的函数可以帮助实现这一点:

@pandas_udf(returnType=StringType())
def convert_id(id):
    converted = id.map(lambda x : str(bs.a85encode(bytearray.fromhex(str(x).replace("-", ""))))[2:-1])
    return converted

【讨论】:

  • 这是在优化速度吗?
  • @pissall:是的,这可以优化速度。通常,这比我阅读的通用 udf 快 3.7 倍。
  • 你能根据经验告诉我吗?
  • @pissall:速度有了显着提升。正常的 UDF 过去 100 万行需要大约 15 分钟,而 Pandas UDF 需要大约 5 分钟。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-06
  • 2020-03-31
相关资源
最近更新 更多