Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 行作为PySpark数据帧中的新列的模式_Python_Apache Spark_Pyspark_Apache Spark Sql - Fatal编程技术网

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|
+---+-----+-----------+-----------+-----------+-----+