Может ли UDF из pyspark вернуть объект, отличный от столбца? - PullRequest
0 голосов
/ 18 декабря 2018

Я хочу применить некоторые функции к столбцам pysaprk dataframe, удастся это сделать с помощью UDF, но я хочу, чтобы возвращение было другим объектом, отличным от столбца dataframe, pandas dataframe, списка 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|
+-------+------------+

Как краткое изложение статей

1 Ответ

0 голосов
/ 18 декабря 2018

Вам нужно использовать udf и также вернуть StringType :

Я вычеркнул вашу константу, на случай, если вы хотите, чтобы она была глобальной, и измените ее для нескольких функций одновременно.

n = 30
m = 20

def description(x):
    if x >= n:
        x = str(n) + " < Income"
    elif x >= m:
        x = str(m) + " < Income < " + str(n)
    else:
        x = "Income < " + str(m)
    return x

description_udf = udf(lambda z: description(z), StringType())

df.select(
    clase_udf('Income').alias('Clases'),
    description_udf("Income").alias("Description")
).distinct().show()

Вывод:

enter image description here

...