Python функция возвращает не тип в AWS Склеить даже ту же функцию, работающую на локальной машине - PullRequest
0 голосов
/ 17 апреля 2020

Я новичок в AWS клей. У меня есть созданная работа, которая будет изменять номер телефона из столбца и обновлять фрейм данных. Ниже скрипт работает нормально на моей локальной машине, где я работаю с pyspark. Это в основном добавляет «+00» к тем телефонным номерам, которые не начинаются с «0»

## Phonenubercolum
6-451-512-3627
0-512-582-3548
1-043-733-0050

def addCountry_code(phoneNo):
    countryCode= '+00'+phoneNo
    if phoneNo[:1] !='0':
        return str(countryCode)
    else:
        return str(phoneNo)

phone_replace_udf=udf(lambda x: addCountry_code(x), StringType())

phoneNo_rep_DF= concatDF.withColumn("phoneNumber", phone_replace_udf(sf.col('phoneNumber')))#.drop('phoneNumber')
##output
+006-451-512-3627
0-512-582-3548
+001-043-733-0050

Но когда я запускал тот же код в склеивает контекст, он выдает следующую ошибку

addCountry_code countryCode= '+00'+phoneNo **TypeError: must be str, not NoneType**

Мне интересно, как эта функция не работает в клею?

Оцените, если кто-нибудь может помочь в этом?

Ответы [ 2 ]

0 голосов
/ 18 апреля 2020

Это должно дать желаемый результат. Используйте spark.udf.register для регистрации функции

import json
import boto3
import pyspark.sql.dataframe
from pyspark.sql.types import StringType

ds = [{'phoneNumber': '6-451-512-3627'},
{'phoneNumber': '0-512-582-3548'},
{'phoneNumber': '1-043-733-0050'}]

sf = spark.createDataFrame(ds)

def addCountry_code(phoneNo):
    countryCode= '+00'+phoneNo
    if phoneNo[:1] !='0':
        return str(countryCode)
    else:
        return str(phoneNo)



spark.udf.register('phone_replace_udf', lambda x: addCountry_code(x), StringType())
sf.createOrReplaceTempView('sf')
spark.sql('select phone_replace_udf(phoneNumber) from sf').collect()
0 голосов
/ 17 апреля 2020

Этого можно добиться, не используя udf (обычно udf медленнее встроенных функций).

from pyspark.sql import SparkSession
from pyspark.sql.functions import udf, col, lit

spark = SparkSession.builder.getOrCreate()

## Phonenubercolum
ds = [{'PhoneNumber': '6-451-512-3627'},
{'PhoneNumber': '0-512-582-3548'},
{'PhoneNumber': '1-043-733-0050'}]

df = spark.createDataFrame(ds)

df = df.withColumn('PhoneNumber', when(
    ~df['PhoneNumber'].startswith('0'), concat(lit('+00'), df['PhoneNumber'])) \
    .otherwise(df['PhoneNumber']))


df.show()

+-----------------+
|      PhoneNumber|
+-----------------+
|+006-451-512-3627|
|   0-512-582-3548|
|+001-043-733-0050|
+-----------------+
...