Python 函数在 AWS Glue 中返回非类型,即使是在本地机器上工作的相同函数

Posted

技术标签:

【中文标题】Python 函数在 AWS Glue 中返回非类型,即使是在本地机器上工作的相同函数【英文标题】:Python function returns non-type in AWS Glue even the same function working in local machine 【发布时间】:2020-04-17 14:48:20 【问题描述】:

我是 AWS 胶水的新手。我有一个创建的作业,可以从列中修改电话号码并更新数据框。 下面的脚本在我使用 pyspark 运行的本地机器上运行良好, 这基本上是针对那些不以'0'开头的电话号码添加'+00'

## 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**

我想知道这个函数是如何在胶合中失败的?

是否有人可以提供帮助?

【问题讨论】:

【参考方案1】:

这应该会给出预期的结果。使用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()

【讨论】:

【参考方案2】:

您可以在不使用 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|
+-----------------+

【讨论】:

谢谢@theredcomet。但是我无法在这里导入'lit',即使我导入了如下的sql函数'从pyspark.sql导入函数作为sf。“如何导入lit? 我发现 '_lit_doc' 是 'lit' 的替代品,所以我在上面的代码中用 '_lit_doc'' 进行了修改。但是现在我收到如下类型错误“ sf.concat(_lit_doc(numberTadd), concatDF['phoneNumber'])).otherwise TypeError: 'str' object is not callable” 嗨@theredcomet,我知道了已修复的点燃问题。但实际情况是,我需要针对那些“不以 0 开头”的值添加“+00”。 ?

以上是关于Python 函数在 AWS Glue 中返回非类型,即使是在本地机器上工作的相同函数的主要内容,如果未能解决你的问题,请参考以下文章

SMTP:邮件未通过 AWS Glue Python 作业发送

使用 Python 在 AWS Glue 中打开和读取文件

AWS Python Shell - 如何使用 Glue 目录连接

如何使用 AWS Glue 从嵌套 json 字段/结构中的 DynamicFrame 访问数据

将 AWS Glue Python 与 NumPy 和 Pandas Python 包一起使用

AWS Glue Python Shell 与 Oracle 的连接