Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用UDF时会忽略中的条件_Python_Apache Spark_Pyspark_Spark Dataframe_User Defined Functions - Fatal编程技术网

Python 使用UDF时会忽略中的条件

Python 使用UDF时会忽略中的条件,python,apache-spark,pyspark,spark-dataframe,user-defined-functions,Python,Apache Spark,Pyspark,Spark Dataframe,User Defined Functions,假设您有以下pyspark数据帧: data=[('foo',),('123',),(无,),('bar',)] df=sqlCtx.createDataFrame(数据,[“列”]) df.show() #+----+ #|上校| #+----+ #|福| #| 123| #|空的| #|酒吧| #+----+ 接下来的两个代码块应该做同样的事情——即,如果列不是null,则返回该列的大写字母。但是,第二种方法(使用udf)会产生错误 方法1:使用pyspark.sql.functions.

假设您有以下pyspark数据帧:

data=[('foo',),('123',),(无,),('bar',)]
df=sqlCtx.createDataFrame(数据,[“列”])
df.show()
#+----+
#|上校|
#+----+
#|福|
#| 123|
#|空的|
#|酒吧|
#+----+
接下来的两个代码块应该做同样的事情——即,如果列不是
null
,则返回该列的大写字母。但是,第二种方法(使用
udf
)会产生错误

方法1:使用
pyspark.sql.functions.upper()

导入pyspark.sql.f函数
df.withColumn(
"上",,
f、 什么时候(
f、 isnull(f.col('col')),
f、 col('col')
).否则(f.upper(f.col('col')))
).show()
#+----+-----+
#|col | upper|
#+----+-----+
#|福|福|
#| 123|  123|
#|空|空|
#|巴|巴|
#+----+-----+
方法2:在
udf中使用
str.upper()

df.withColumn(
"上",,
f、 什么时候(
f、 isnull(f.col('col')),
f、 col('col')
)。否则(f.udf(lambda x:x.upper(),StringType())(f.col('col'))
).show()
这给了我
AttributeError:'NoneType'对象没有属性'upper'
。当
似乎被忽略时,为什么
f.isnull()
签入对
的调用

我知道我可以将我的
udf
更改为
f.udf(lambda x:x.upper(),如果x else x,StringType())
以避免此错误,但我想了解发生此错误的原因

完全回溯

Py4JJavaErrorTraceback(最近一次调用)
在()
4 f.isnull(f.col('col')),
5 f.col(“col”)
---->6).否则(f.udf(lambda x:x.upper(),StringType())(f.col('col'))
7)show()
/show中的opt/SPARK2/lib/SPARK2/python/pyspark/sql/dataframe.py(self,n,truncate)
316         """
317如果存在(截断,布尔)和截断:
-->318打印(self._jdf.showString(n,20))
319其他:
320打印(self.\u jdf.showString(n,int(truncate)))
/opt/SPARK2/lib/SPARK2/python/lib/py4j-0.10.4-src.zip/py4j/java_gateway.py in___调用(self,*args)
1131 answer=self.gateway\u client.send\u命令(command)
1132返回值=获取返回值(
->1133应答,self.gateway\u客户端,self.target\u id,self.name)
1134
1135对于临时参数中的临时参数:
/装饰中的opt/SPARK2/lib/SPARK2/python/pyspark/sql/utils.py(*a,**kw)
61 def装饰(*a,**千瓦):
62尝试:
--->63返回f(*a,**kw)
64除py4j.protocol.Py4JJavaError外的其他错误为e:
65 s=e.java_exception.toString()
/获取返回值中的opt/SPARK2/lib/SPARK2/python/lib/py4j-0.10.4-src.zip/py4j/protocol.py(答案、网关客户端、目标id、名称)
317 raise Py4JJavaError(
318“调用{0}{1}{2}时出错。\n”。
-->319格式(目标id,“.”,名称),值)
320其他:
321升起Py4JError(
Py4JJavaError:调用o642.showString时出错。
:org.apache.SparkException:作业因阶段失败而中止:阶段77.0中的Task 51失败4次,最近的失败:阶段77.0中的Task 51.3丢失(TID 5101,someserver.prod.somecompany.net,executor 99):org.apache.spark.api.python.python异常:回溯(最近一次调用):
文件“/opt/SPARK2/lib/SPARK2/python/lib/pyspark.zip/pyspark/worker.py”,主文件第174行
过程()
文件“/opt/SPARK2/lib/SPARK2/python/lib/pyspark.zip/pyspark/worker.py”,第169行,正在处理中
serializer.dump_流(func(拆分索引,迭代器),outfile)
文件“/opt/SPARK2/lib/SPARK2/python/lib/pyspark.zip/pyspark/worker.py”,第106行,在
func=lambda,it:map(映射器,it)
文件“/opt/SPARK2/lib/SPARK2/python/lib/pyspark.zip/pyspark/worker.py”,第92行,在
映射器=λa:udf(*a)
文件“/opt/SPARK2/lib/SPARK2/python/lib/pyspark.zip/pyspark/worker.py”,第70行,在
返回λ*a:f(*a)
文件“”,第6行,在
AttributeError:“非类型”对象没有属性“上限”

您必须记住,Spark SQL(与RDD不同)不是您所看到的,而是您所得到的。Optimizer/planner可以按任意顺序安排操作,甚至可以多次重复这些步骤

Python
UDF
不是在
Row
的基础上应用的,而是使用批处理模式。
没有被忽略,但不用于优化执行计划时:

== Physical Plan ==
*Project [col#0, CASE WHEN isnull(col#0) THEN col#0 ELSE pythonUDF0#21 END AS upper#17]
+- BatchEvalPython [<lambda>(col#0)], [col#0, pythonUDF0#21]
   +- Scan ExistingRDD[col#0]
df.withColumn(
    'upper',
    f.udf(
        lambda x: x.upper() if x is not None else None, 
        StringType()
    )(f.col('col'))
).show()