AWS胶水pyspark UDF

AWS胶水pyspark UDF,pyspark,aws-glue,Pyspark,Aws Glue,在AWS Glue中,我需要转换浮点值(摄氏度到华氏度),并使用UDF 以下是我的UDF: toFahrenheit=udf(lambda x:'-1'如果未找到x,则为x*9/5+32,StringType()) 我在spark数据框中使用UDF,如下所示: weather_df.with column(“new_tmax”),toFahrenheit(weather_df[“tmax”))。drop(“tmax”)。with column重命名(“new_tmax”,“tmax”) 当我

在AWS Glue中,我需要转换浮点值(摄氏度到华氏度),并使用UDF

以下是我的UDF:

toFahrenheit=udf(lambda x:'-1'如果未找到x,则为x*9/5+32,StringType())
我在spark数据框中使用UDF,如下所示:

weather_df.with column(“new_tmax”),toFahrenheit(weather_df[“tmax”))。drop(“tmax”)。with column重命名(“new_tmax”,“tmax”)
当我运行代码时,收到的错误消息如下:

IllegalArgumentException:u“要求失败:列数不匹配。\n旧列名(11):站点、名称、纬度、经度、高程、日期、雨篷、prcp、雪、tmin、tmax\n新列名(0)”
我不知道如何调用UDF,因为我是python/pyspark新手,并且我的新列模式没有创建,并且为空

用于上述样本的截取代码为:

%pyspark
导入系统
从pyspark.context导入SparkContext
从awsglue.context导入GlueContext
从awsglue.context导入DynamicFrame
从awsglue.transforms导入*
从awsglue.utils导入getResolvedOptions
从awsglue.job导入作业
从pyspark.sql导入SparkSession
从pyspark.sql.functions导入udf
从pyspark.sql.types导入StringType
glueContext=glueContext(SparkContext.getOrCreate())
weather\u raw=glueContext。从目录(database=“ohare-airport-2006”,table=“ohare\u intl\u airport\u 2006\u 08\u climate\u csv”)创建动态框架
打印“cpnt:”,weather_raw.count()
weather_raw.printSchema()
天气预报(10)
#UDF将空气温度从摄氏度转换为华氏度(用于样本转换)
#toFahrenheit=udf(λc:c[1:],c*9/5+32)
toFahrenheit=udf(lambda x:'-1'如果未找到其他类别中的x,则为x*9/5+32,StringType())
#将UDF应用于最高和最低空气温度
wthdf=气象测向。带列(“新tmin”,toFahrenheit(气象测向[“tmin”))。带列(“新tmax”,toFahrenheit(气象测向[“tmax”))。下降(“tmax”)。下降(“tmin”)。带列重命名(“新tmax”,“tmax”)。带列重命名(“新tmin”,“tmin”)
wthdf.toDF().show(5)
的模式

weather\u df:
根
|--电台:弦
|--名称:string
|--纬度:双
|--经度:双倍
|--标高:双
|--日期:string
|--芒:双
|--fmtm:字符串
|--pgtm:字符串
|--prcp:双
|--雪:双人
|--snwd:长
|--塔夫格:字符串
|--tmax:长
|--特敏:长
错误跟踪:

回溯(最近一次呼叫最后一次):
文件“/tmp/zeppelin_pyspark-3684249459612979499.py”,第349行,在
引发异常(traceback.format_exc())
例外情况:回溯(最近一次呼叫最后一次):
文件“/tmp/zeppelin_pyspark-3684249459612979499.py”,第342行,在
行政主任(代码)
文件“”,第3行,在
文件“/usr/lib/spark/python/pyspark/sql/dataframe.py”,第1558行,toDF格式
jdf=self.\u jdf.toDF(self.\u jseq(cols))
文件“/usr/lib/spark/python/lib/py4j-0.10.4-src.zip/py4j/java_gateway.py”,第1133行,在__
回答,self.gateway\u客户端,self.target\u id,self.name)
文件“/usr/lib/spark/python/pyspark/sql/utils.py”,第79行,deco格式
引发IllegalArgumentException(s.split(“:”,1)[1],stackTrace)
IllegalArgumentException:u“要求失败:列数不匹配。\n旧列名(11):站点、名称、纬度、经度、海拔、日期、雨篷、prcp、雪、tmin、tmax\n新列名(0)”
感谢上述解决方案(摄氏度到华氏度),以备参考:

#UDF to convert the air temperature from celsius to fahrenheit
toFahrenheit = udf(lambda x: x * 9 / 5 + 32, StringType())

weather_in_Fahrenheit = weather_df.withColumn("new_tmax", toFahrenheit(weather_df["tmax"])).withColumn("new_tmin", toFahrenheit(weather_df["tmin"])).drop("tmax").drop("tmin").withColumnRenamed("new_tmax","tmax").withColumnRenamed("new_tmin","tmin")

weather_in_Fahrenheit.show(5)
原始数据样本:

+-----------+--------------------+---------+--------+---------+----+----+----+----+----------+
|    station|                name|elevation|latitude|longitude|prcp|snow|tmax|tmin|      date|
+-----------+--------------------+---------+--------+---------+----+----+----+----+----------+
|USW00094846|CHICAGO OHARE INT...|    201.8|  41.995| -87.9336| 0.0| 0.0|  25|  11|2013-01-01|
|USW00094846|CHICAGO OHARE INT...|    201.8|  41.995| -87.9336| 0.0| 0.0|  30|  10|2013-01-02|
|USW00094846|CHICAGO OHARE INT...|    201.8|  41.995| -87.9336| 0.0| 0.0|  29|  18|2013-01-03|
|USW00094846|CHICAGO OHARE INT...|    201.8|  41.995| -87.9336| 0.0| 0.0|  36|  13|2013-01-04|
|USW00094846|CHICAGO OHARE INT...|    201.8|  41.995| -87.9336|0.03| 0.4|  39|  18|2013-01-05|
|USW00094846|CHICAGO OHARE INT...|    201.8|  41.995| -87.9336| 0.0| 0.0|  36|  18|2013-01-06|
|USW00094846|CHICAGO OHARE INT...|    201.8|  41.995| -87.9336| 0.0| 0.0|  41|  15|2013-01-07|
|USW00094846|CHICAGO OHARE INT...|    201.8|  41.995| -87.9336| 0.0| 0.0|  44|  22|2013-01-08|
|USW00094846|CHICAGO OHARE INT...|    201.8|  41.995| -87.9336| 0.0| 0.0|  50|  27|2013-01-09|
|USW00094846|CHICAGO OHARE INT...|    201.8|  41.995| -87.9336|0.63| 0.0|  45|  22|2013-01-10|
+-----------+--------------------+---------+--------+---------+----+----+----+----+----------+
应用UDF toFahrenheit后:

+-----------+--------------------+--------+---------+---------+----------+-----+----+----+----+----+
|    station|                name|latitude|longitude|elevation|      date| awnd|prcp|snow|tmax|tmin|
+-----------+--------------------+--------+---------+---------+----------+-----+----+----+----+----+
|USW00094846|CHICAGO OHARE INT...|  41.995| -87.9336|    201.8|2013-01-01|  8.5| 0.0| 0.0|  77|  51|
|USW00094846|CHICAGO OHARE INT...|  41.995| -87.9336|    201.8|2013-01-02| 8.05| 0.0| 0.0|  86|  50|
|USW00094846|CHICAGO OHARE INT...|  41.995| -87.9336|    201.8|2013-01-03|11.41| 0.0| 0.0|  84|  64|
|USW00094846|CHICAGO OHARE INT...|  41.995| -87.9336|    201.8|2013-01-04| 13.2| 0.0| 0.0|  96|  55|
|USW00094846|CHICAGO OHARE INT...|  41.995| -87.9336|    201.8|2013-01-05| 9.62|0.03| 0.4| 102|  64|
+-----------+--------------------+--------+---------+---------+----------+-----+----+----+----+----+

您使用的是什么版本的python?它的Python2.7,使用AWS的开发端点。您能否尝试提供足够的数据来创建一个?例如,找不到的
是什么。此外,您不需要删除该列。可以使用
withColumn()
在位修改列。请看最近的一个问题。谢谢pault,我已经用我使用的dataframe的代码片段“schema details”更新了我的问题,供您参考。我认为我在UDF及其使用方面出了问题。请建议正确的自定义项和用法。