Подстрока Pyspark не работает внутри UDF - PullRequest
0 голосов
/ 06 февраля 2020

Я тщетно пытаюсь использовать функцию подстроки Pyspark внутри UDF. Ниже приведен мой фрагмент кода -

from pyspark.sql.functions import substring

def my_udf(my_str):
    try:
        my_sub_str = substring(my_str,1, 2)
    except Exception:
        pass
    else:
        return (my_sub_str)

apply_my_udf = udf(my_udf)

df = input_data.withColumn("sub_str", apply_my_udf(input_data.col0))

Пример данных -

ABC1234
DEF2345
GHI3456

Но когда я печатаю df, я не получаю никакого значения в новом столбце "sub_str" как показано ниже -

[Row(col0='ABC1234', sub_str=None), Row(col0='DEF2345', sub_str=None), Row(col0='GHI3456', sub_str=None)]

Может кто-нибудь, пожалуйста, дайте мне знать, что я делаю неправильно?

Ответы [ 2 ]

1 голос
/ 06 февраля 2020

Если вам нужно использовать udf для этого, вы также можете попробовать что-то вроде:

input_data = spark.createDataFrame([
    (1,"ABC1234"), 
    (2,"DEF2345"),
    (3,"GHI3456")
], ("id","col0"))

from pyspark.sql.functions import udf
from pyspark.sql.types import StringType

udf1 = udf(lambda x:x[0:2],StringType())
df.withColumn('sub_str',udf1('col0')).show()

+---+-------+-------+
| id|   col0|sub_str|
+---+-------+-------+
|  1|ABC1234|     AB|
|  2|DEF2345|     DE|
|  3|GHI3456|     GH|
+---+-------+-------+

Однако, как писал Мохаммед Али ДЖАМАУИ - вы можете легко обойтись без udf здесь.

1 голос
/ 06 февраля 2020

Вам не нужно udf, чтобы использовать substring, вот более чистый и быстрый способ:

>>> from pyspark.sql import functions as f
>>> df.show()
+-------+
|   data|
+-------+
|ABC1234|
|DEF2345|
|GHI3456|
+-------+

>>> df.withColumn("sub_str", f.substring("data", 1, 2)).show()
+-------+-------+
|   data|sub_str|
+-------+-------+
|ABC1234|     AB|
|DEF2345|     DE|
|GHI3456|     GH|
+-------+-------+ 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...