Python Pyspark SQL查询以获取+;/-特定列的20%

Python Pyspark SQL查询以获取+;/-特定列的20%,python,sql,pyspark,apache-spark-sql,pyspark-sql,Python,Sql,Pyspark,Apache Spark Sql,Pyspark Sql,我有以下建议: +------------------+--------+-------+ | ID| Assets|Revenue| +------------------+--------+-------+ |201542399349300619| 1633944| 32850| |201542399349300629| 3979760| 850914| |201542399349300634| 3402687|1983568| |2015423993493

我有以下建议:

+------------------+--------+-------+
|                ID|  Assets|Revenue|
+------------------+--------+-------+
|201542399349300619| 1633944|  32850|
|201542399349300629| 3979760| 850914|
|201542399349300634| 3402687|1983568|
|201542399349300724| 1138291|1097553|
|201522369349300122| 1401406|1010828|
|201522369349300137|   16948| 171534|
|201522369349300142|13474056|2285323|
|201522369349300202|  481045| 241788|
|201522369349300207|  700861|1185640|
|201522369349300227|  178479| 267976|
+------------------+--------+-------+
对于每一行,我希望能够获得资产金额20%以内的行。例如,对于第一行(ID=2015423993493300619),我希望能够获得资产在1633944的20%+/-范围内的所有行(因此在1307155到1960732之间):

使用此子集表,我希望获得平均资产并将其添加为新列。因此,对于上述示例,它将是(1633944+1401406)=1517675的平均资产

+------------------+--------+-------+---------+
|                ID|  Assets|Revenue|AvgAssets|
+------------------+--------+-------+---------+
|201542399349300619| 1633944|  32850|  1517675|

假设您的数据帧具有与以下类似的模式(即
资产
收入
是数字):

df.printSchema()
#根
#|--ID:long(nullable=true)
#|--资产:整数(nullable=true)
#|--收入:整数(nullable=true)
您可以在您设定的条件下将数据帧转换为自身。联接之后,您可以通过取
资产
列的平均值来进行分组和聚合

例如:

从pyspark.sql.functions导入平均值,expr
df.别名(“l”)\
.加入(
df.别名(“r”),
on=expr(“l.assets*0.8和l.assets*1.2之间的r.assets”)
)\
.groupBy(“l.ID”、“l.Assets”、“l.Revenue”)\
.agg(平均(“r.Assets”).别名(“平均资产”))\
.show()
#+------------------+--------+-------+------------------+
#|ID |资产|收入| AvgAssets|
#+------------------+--------+-------+------------------+
#|201542399349300629| 3979760| 850914|         3691223.5|
#|201522369349300202|  481045| 241788|          481045.0|
#|201522369349300207|  700861|1185640|          700861.0|
#|201522369349300137|   16948| 171534|           16948.0|
#|201522369349300142 | 13474056 | 2285323 | 1.3474056E7|
#|201522369349300227|  178479| 267976|          178479.0|
#|201542399349300619| 1633944|  32850|         1517675.0|
#|201522369349300122| 1401406|1010828|1391213.6666666667|
#|201542399349300724| 1138291|1097553|         1138291.0|
#|201542399349300634| 3402687|1983568|         3691223.5|
#+------------------+--------+-------+------------------+
由于我们将数据帧连接到自身,因此可以使用别名来引用左表(
“l”
)和右表(
“r”
)。上面的逻辑表示将
l
连接到
r
,条件是
r
中的资产为
l
中资产的+/20%

有多种方法可以表示+/20%条件,但我使用spark sql
between
表达式来查找介于
Assets*0.8
Assets*1.2
之间的行

然后,我们对左表的所有列(
groupBy
)进行聚合,并对右表中的资产进行平均

生成的
AvgAssets
列是一个
FloatType
列,但如果您喜欢,可以通过在
.alias(“AvgAssets”)
之前添加
.cast(“int”)
将其轻松转换为
IntegerType


另见:


@pault我搞错了,我已经更正了拼写错误。我不太熟悉SQL,因此我只想获得一些关于如何利用现有资源实现这一点的指导。
+------------------+--------+-------+---------+
|                ID|  Assets|Revenue|AvgAssets|
+------------------+--------+-------+---------+
|201542399349300619| 1633944|  32850|  1517675|