【发布时间】:2018-12-18 17:29:23
【问题描述】:
我想将一些函数应用于 pysaprk 数据框的列,并设法使用 UDF 执行此操作,但我希望返回不同于数据框的列、pandas 数据框、python 列表的另一个对象,等等
我正在使用分类器将每一列划分为类,但我希望结果是类的摘要,而不是 pyspark 数据框修改,我不知道这是否适用于 UDF
我的代码是这样的
import numpy as np
import pandas as pd
import pyspark
from pyspark.sql import SQLContext
from pyspark.sql.functions import udf
from pyspark.sql.types import IntegerType, StringType, FloatType, DoubleType
sc = pyspark.SparkContext()
sqlCtx = SQLContext(sc)
df_pd = pd.DataFrame(
data={ 'Income':[12.0,45.0,24.0,24.0,54.0],
'Debt':[23.0,4.0,1.0,6.0,3.0]} )
df = sqlCtx.createDataFrame(df_pd)
# function
def clase(x):
#n = np.mean(df_pd[name])
#n = np.mean(df_pd["Ingresos"])
n = 30
m = 20
if x>=n:
x="good"
elif x>=m:
x="regular"
else:
x="bad"
return x
# UDF
clase_udf = udf(lambda z: clase(z), StringType())
(
df.select('Income',
'Debt',
clase_udf('Income').alias('new') )
.show()
)
这给出了下一个表:
+------+----+-------+
|Income|Debt| new|
+------+----+-------+
| 12.0|23.0| bad|
| 45.0| 4.0| good|
| 24.0| 1.0|regular|
| 24.0| 6.0|regular|
| 54.0| 3.0| good|
+------+----+-------+
我想要的是得到这样的东西:
+-------+------------+
| Clases| Description|
+-------+------------+
| good| 30<Income|
|regular|20<Income<30|
| bad| Income<20|
+-------+------------+
喜欢类的总结
【问题讨论】:
-
您不需要
udf来获取new列。不过,我不清楚你在问什么。您想从数据中导出Description吗?但是您为good, bad, regular指定了削减... -
所需的输出与您的输入有什么关系?如果您已经知道
m和n,为什么不直接使用spark.createDataFrame([('good', '30<Income'), ('regular', '20<Income<30'), ('bad', 'Income<20')], ["Clases", "Description"])?
标签: python dataframe pyspark user-defined-functions