python-3.x - 在 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
解决此问题的任何帮助都会有很大帮助。谢谢。
解决方案
让我们从创建数据开始:
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']
推荐阅读
- python - 我运行 pip freeze | xargs pip uninstall -y 在命令提示符下。会影响我的电脑吗?
- reactjs - 使 Antd 3.x Popover 组件可以通过键盘的 tab 键访问
- oracle - 在 Windows 10 上安装 Oracle 19c 时出现问题
- c++ - C++ 中带有构造函数的模板化 typedef 结构
- image - 在 Embarcadero C++Builder 中反转位图
- excel - 在 WebBrowser1 中查看图像并调整其大小
- javascript - 当用户从他们打开的另一个选项卡中注销时,如何将用户发送到登录页面?
- android - androidx.navigation 菜单项的多个目的地
- amazon-ec2 - ModuleNotFoundError:没有名为“wtforms_json”的模块
- flutter - 如何将我的提供商转变为服务?