首页 > 解决方案 > 在 pyspark 中创建派生列时如何解决以下问题?

问题描述

我正在尝试根据字典中给出的数据对数据框中的特定列进行分箱。

以下是我使用的数据框:

df

SNo,姓名,CScore
1,x,700
2,y,850
3,z,560
4,a,578
5,b,456
6,c,678

我已经创建了以下功能,如果我单独使用它,它工作正常。

定义分箱(列,字典):
    最终列=[]
    借= len(列)
    对于我在范围内(借出):
        对于范围内的 j(len(list(dict))):
            if( int(column[i]) in range(list(dict)[j][0],list(dict)[j][1])):
                finalColumn.append(dict[list(dict)[j]])
    返回最终列

我在下面的语句中使用了上述函数。

newDf = df.withColumn("binnedColumn",binning(df.select("CScore").rdd.flatMap(lambda x: x).collect(),{(1,400):'Low',(401,900):'High '}))

我收到以下错误:

Traceback(最近一次调用最后一次):文件“”,第 1 行,在文件“C:\spark_2.4\python\pyspark\sql\dataframe.py”中,第 1988 行,在 withColumn assert isinstance(col, Column) 中,“ col 应该是 Column" AssertionError: col 应该是 Column

解决此问题的任何帮助都会有很大帮助。谢谢。

标签: python-3.xapache-sparkpysparkapache-spark-sqlpyspark-sql

解决方案


让我们从创建数据开始:

rdd = sc.parallelize([[1,"x",700],[2,"y",850],[3,"z",560],[4,"a",578],[5,"b",456],[6,"c",678]])
df = rdd.toDF(["SNo","Name","CScore"])
>>> df.show()
+---+----+------+
|SNo|Name|CScore|
+---+----+------+
|  1|   x|   700|
|  2|   y|   850|
|  3|   z|   560|
|  4|   a|   578|
|  5|   b|   456|
|  6|   c|   678|
+---+----+------+

如果您的最终目标是像您的示例一样提供 binning_dictionary,则可以找到相应的分类值。udf 是解决方案。

以下是您的正常功能。

bin_lookup = {(1,400):'Low',(401,900):'High'}
def binning(value, lookup_dict=bin_lookup):
    for key in lookup_dict.keys():
        if key[0] <= value <= key[1]:
             return lookup_dict[key]

注册为 udf 并通过数据框运行它:

from pyspark.sql.functions import udf
from pyspark.sql.types import StringType

binning_udf = udf(binning, StringType())
>>> df.withColumn("binnedColumn", binning_udf("CScore")).show()
+---+----+------+------------+
|SNo|Name|CScore|binnedColumn|
+---+----+------+------------+
|  1|   x|   700|        High|
|  2|   y|   850|        High|
|  3|   z|   560|        High|
|  4|   a|   578|        High|
|  5|   b|   456|        High|
|  6|   c|   678|        High|
+---+----+------+------------+

直接申请rdd:

>>> rdd.map(lambda row: binning(row[-1], bin_lookup)).collect()
['High', 'High', 'High', 'High', 'High', 'High']


推荐阅读