PySpark-将映射函数添加为列

PySpark-将映射函数添加为列,pyspark,apache-spark-sql,rdd,Pyspark,Apache Spark Sql,Rdd,我有一个Pypark数据框 a=[ ('Bob',562), ('Bob',880), ('Bob',380), ('Sue',85), ('Sue',963) ] df=spark.createDataFrame(a、[“个人”、“金额”]) 我需要创建一个列,它散列金额,并返回金额。问题是我不能使用UDF,所以我使用了映射函数 df.rdd.map(lambda x:hash(x[“Amount”])) 如果不能使用udf可以使用map功能,但在您当前编写的功能中,只有一列。要保留所有列

我有一个Pypark数据框

a=[
('Bob',562),
('Bob',880),
('Bob',380),
('Sue',85),
('Sue',963)
] 
df=spark.createDataFrame(a、[“个人”、“金额”])
我需要创建一个列,它散列
金额
,并返回金额。问题是我不能使用
UDF
,所以我使用了映射函数

df.rdd.map(lambda x:hash(x[“Amount”]))

如果不能使用
udf
可以使用
map
功能,但在您当前编写的功能中,只有一列。要保留所有列,请执行以下操作:

df=df.rdd\
.map(lambda x:(x[“Person”]、x[“Amount”]、散列(str(x[“Amount”]))\
.toDF([“个人”、“金额”、“散列”])
df.show()
#+------+------+--------------------+
#|人|金额|散列|
#+------+------+--------------------+
#|鲍勃| 562 |-4340709941618811062|
#|鲍勃| 880 |-7718876479167384701|
#|鲍勃| 380 |-2088598916611095344|
#|苏| 85 | 7168043064064671|
#|苏| 963 |-8844931991662242457|
#+------+------+--------------------+
注意:在这种情况下,
散列(x[“Amount”])
不是很有趣,所以我将其更改为hash
Amount
转换为字符串

实际上,您必须将行映射到包含所有现有列的元组,并添加新列

如果列太多而无法枚举,也可以只向现有行添加一个元组

df=df.rdd\
.map(lambda x:x+(散列(str(x[“Amount”])),)\
.toDF(df.columns+[“Hash”])\

我还应该指出,如果散列值是您的最终目标,那么还有一个pyspark函数可以用来避免对
rdd
的序列化:

导入pyspark.sql.f函数
df.withColumn(“Hash”,f.Hash(“Amount”).show()
#+------+------+----------+
#|人|金额|散列|
#+------+------+----------+
#|鲍勃| 562 | 51343841|
#|鲍勃| 880 | 1241753636|
#|鲍勃| 380 | 514174926|
#|苏| 85 | 1944150283|
#|苏| 963 | 1665082423|
#+------+------+----------+
这似乎使用了不同于python内置的哈希算法