udf使用出错

2018/04/15

为啥想用呢????
使用自定义函数。
http://spark.apache.org/docs/latest/sql-programming-guide.html#pandas-udfs-aka-vectorized-udfs
首先没有安装这个库。

image.png

clush -a "pip install pyarrow -i https://pypi.douban.com/simple/"

image.png

我感觉是,这个部分的代码写的不对。
通过检测,这部分是因为pyarrow的原因导致的错误。他在导入初始化的时候,没有获取到版本,所以出错。
这个就不好修改了,还是直接就用注释掉这个代码吧。

最简单的方法,
spark-2.3.0-bin-hadoop2.7/python/pyspark/sql/utils.py
注释这段检查版本的语句,反正我已经满足他安装要求了。


然后又出现错误。

image.png

怀疑是没有安装pandas的库。
安装之后,没有继续报这个错。


但是出来新的错。
看来这部分的这个数据类型,还真是麻烦。

好了,现在能用了。
现在来看一下具体是怎么使用过的。
保证上面的库都安装好,然后还消除了版本的检查。

利用udf注册函数,这里一定要保证这个返回的类型正确,我感觉我后续几次的出错都是因为这个数据类型没有得到匹配,所以出错的。相应的类型在spark官网那个python API地方有。


2018/04/16
比较重要的一个观点就是,输入是一个pandas的Series类型的数据,那么返回的必须也是这种类型。
好像是,这个东西的类型,如果是更高层次的话,就是dataframe,看了看方法,就跟spark里面的东西很相近。

一定要注意,这部分,使用的是用户定义的函数去处理标量。
跟聚合的类型不一样。

测试了一下,因为他传进来的是一个Series,我理解的哈,因为数据是分成partition的,他是一大堆数据都传进来。
那么有一些简单的操作,就比如加法减法什么的他都可以之间做了。但是自定义的,他没有办法。
因为我正常来说,就是想去对每个元素进行操作。
比较好的办法,就是用它实现的这个map操作来进行,而且已经实验成功。
!!!!!

2018/04/20
比较尴尬的是,我发现他的范例里面是用的select,但是python帮助手册里面没有显示。
但这也给我了个提示,就是他这个东西呢,只要传过去的变量类型一致就可以。

Scalar Pandas UDFs are used for vectorizing scalar operations. They can be used with functions such as select and withColumn.

2018/04/23

貌似对于这个udf类型的array类型,pyarrow并没有完成的非常好。这就比较尴尬了。
感觉就是使用了,不过我记得,当时使用了内置函数就可以使用。
还是对基础的数据结构没有掌握透彻,也是很尴尬。


因为在用pd.Series的时候,就把这个数组当成了一个序列里。
应该使用这种形式pd.Series([[]])
就是列表里面包含列表。

你可能感兴趣的:(udf使用出错)