Python 行作为PySpark数据帧中的新列的模式
是否可以根据前几列的最大值添加新列,其中前几列是字符串文字。考虑下面的数据文件:Python 行作为PySpark数据帧中的新列的模式,python,apache-spark,pyspark,apache-spark-sql,Python,Apache Spark,Pyspark,Apache Spark Sql,是否可以根据前几列的最大值添加新列,其中前几列是字符串文字。考虑下面的数据文件: df=spark.createDataFrame( [ ('1',25000,“黑”、“黑”、“白”), ('2',16000,“红色”、“黑色”、“白色”), ], ['ID'、'cash'、'Color\u body'、'Color\u head'、'Color\u foot'] ) 然后目标帧应如下所示: df=spark.createDataFrame( [ ('1',25000,“黑”、“黑”、“白”、
df=spark.createDataFrame(
[
('1',25000,“黑”、“黑”、“白”),
('2',16000,“红色”、“黑色”、“白色”),
],
['ID'、'cash'、'Color\u body'、'Color\u head'、'Color\u foot']
)
然后目标帧应如下所示:
df=spark.createDataFrame(
[
('1',25000,“黑”、“黑”、“白”、“黑”),
('2',16000,“红”、“黑”、“白”、“白”),
],
['ID'、'cash'、'Color\u body'、'Color\u head'、'Color\u foot'、'max\u v']
)
如果没有最大可检测颜色,则应使用最后一种有效颜色
是否存在某种计数器可能性或udf?围绕
统计定义一个udf。mode
使用所需语义计算行模式:
import statistics
from pyspark.sql.functions import udf, col
from pyspark.sql.types import StringType
def mode(*x):
try:
return statistics.mode(x)
except statistics.StatisticsError:
return x[-1]
mode = udf(mode, StringType())
对于任意数量的列的一般情况,这是一种方法 但是,在这个只有3列的特定情况下,实际上可以使用
pyspark.sql.functions.when
简化逻辑,这将是一个简单的例子
从pyspark.sql.functions导入col,当
def模式(身体、头部、脚部):
返回(
什么时候(
(身体=头)|(身体=脚),
身体
).什么时候(
(头=脚),
头
).否则(英尺)
)
df.withColumn(
“max_v”,
第三种颜色的模式(颜色(“身体”)、颜色(“头部”)、颜色(“脚”))
).show()
#+---+-----+-----------+-----------+-----------+-----+
#|ID |现金|颜色|身体|颜色|头部|颜色|脚|马克斯| v|
#+---+-----+-----------+-----------+-----------+-----+
#|1 | 25000 |黑|黑|白|黑|
#|2 | 16000 |红|黑|白|白|
#+---+-----+-----------+-----------+-----------+-----+
您只需检查任意两列是否相等-如果是,则该值必须为模式。如果没有,请返回最后一列。在这种情况下,使用
udf
比使用API函数更好。@pault我在研究中做了尽职调查,阅读了大约30个链接,但找不到任何关于行模式的有用信息。PySpark在使用熊猫模式和简单的方式(axis=1)后受到了严重的限制:可以进行PIt——它需要一个爆炸
(或者可能是一个posexplode
)然后是一个计数
,然后是一个排名
,使用两个独立的窗口
函数。这来自使用API函数寻找解决方案的人……实际上,您可以简化逻辑,在时删除第二个条件,因为在这两种情况下,您都将返回英尺
,但我会留下它,以防有人想要返回不同的默认值。
df.withColumn("max_v", mode(*[col(c) for c in df.columns if 'colour' in c])).show()
+---+-----+-----------+-----------+-----------+-----+
| ID| cash|colour_body|colour_head|colour_foot|max_v|
+---+-----+-----------+-----------+-----------+-----+
| 1|25000| black| black| white|black|
| 2|16000| red| black| white|white|
+---+-----+-----------+-----------+-----------+-----+