Apache spark pyspark rdd映射未调用函数
我试图在我的RDD上做一些转换,为此,我使用map调用了一个函数。但是,未调用此函数。有人请让我知道我做错了什么 我可以看到调用了Apache spark pyspark rdd映射未调用函数,apache-spark,hadoop,pyspark,Apache Spark,Hadoop,Pyspark,我试图在我的RDD上做一些转换,为此,我使用map调用了一个函数。但是,未调用此函数。有人请让我知道我做错了什么 我可以看到调用了test函数,但没有store\u pass\u info def存储过去信息(行): 打印“--------------存储\过去\信息------------------” 如果行[“transactiontype”]=“Return”: 全球prv_交易编号 prv_交易编号=行[“交易编号”] 发生全局返回错误 return\u occurrend=True
test
函数,但没有store\u pass\u info
def存储过去信息(行):
打印“--------------存储\过去\信息------------------”
如果行[“transactiontype”]=“Return”:
全球prv_交易编号
prv_交易编号=行[“交易编号”]
发生全局返回错误
return\u occurrend=True
全局组id
组id.追加(第[“transnumber”]行)
如果行[“transactiontype”]=“购买”:
如果发生返回\u:
全局组id
组标识追加(prv交易号)
其他:
全局组id
组id.追加(第[“transnumber”]行)
打印组id
def测试(rdd):
打印“--------------测试------------------”
map(存储过去的信息).collect()
打印组id
这就是它在商店中的工作方式:
org\u id
为您要退货的采购订单的id
id
的新购买条目日期类型Id组织Id
2018年3月25日购买111
2018年3月25日购买112
2018年3月26日申报表113 111
26-03-2018采购111
输出
我想添加一个新的列组id,它将显示退货的相同id和退货后发生的相应购买(客户不进行此购买,这是系统为每次退货保留条目的方式)步骤2.1
日期类型标识组织标识组标识
2018年3月25日购买111 111
2018年3月25日购买112
2018年3月26日申报表113 111 113
26-03-2018采购111 113
IIUC,我相信您可以使用DataFrame
s、pyspark.sql.Window
函数和crossJoin()
首先使用以下命令将rdd
转换为数据帧
df=rdd.toDF()#您可能需要指定列名
df.show()
#+----------+--------+---+------+
#|日期|类型| Id |组织| Id|
#+----------+--------+---+------+
#|2018年3月25日|购买| 111 |无效|
#|2018年3月25日|购买| 112 |无效|
#|26-03-2018 |返回| 113 | 111|
#|2018年3月26日|购买| 111 |无效|
#+----------+--------+---+------+
然后我们需要添加一个索引列来跟踪行的顺序。我们可以使用。这将保证值将增加(以便可以排序),但并不意味着它们将是连续的
导入pyspark.sql.f函数
df=df.withColumn('Index',f.单调地增加\u id())
df.show()
#+----------+--------+---+------+-----------+
#|日期|类型| Id |组织| Id |索引|
#+----------+--------+---+------+-----------+
#|2018年3月25日|购买| 111 |无效| 8589934592|
#|2018年3月25日|购买| 112 |无效| 17179869184|
#|26-03-2018 |返回| 113 | 111 | 34359738368|
#|2018年3月26日|购买| 111 |空| 42949672960|
#+----------+--------+---+------+-----------+
排序很重要,因为您希望查找返回后的行
下一步用于将数据帧
连接到自身
由于这将返回笛卡尔积,因此我们将仅对满足以下任一条件的行进行过滤:
(实际上是将一行连接到自身)l.Index=r.Index
(一个(l.Id=r.org\u Id)和(l.Index>r.Index)
等于前面一行的Id
,这是索引列有用的地方)org\u Id
组id
添加一列,如果满足第二个条件,则将其设置为等于r.id
。否则,我们将此列设置为None
df1=df.alias('l')。交叉连接(df.alias('r'))\
。其中(‘(l.Index=r.Index)或((l.Id=r.org_Id)和(l.Index>r.Index))’)\
.选择(
“l.Index”,
“l.Date”,
“l.Type”,
“l.Id”,
“l.org_id”,
f、 什么时候(
(f.col('l.Id')==f.col('r.org_Id'))和(f.col('l.Index')>f.col('r.Index')),
f、 col('r.Id')
).否则(f.lit(None)).alias('group_id')
)
df1.show()
#+-----------+----------+--------+---+------+--------+
#|索引|日期|类型| Id |组织Id |集团Id|
#+-----------+----------+--------+---+------+--------+
#|8589934592 | 25-03-2018 |采购| 111 |空|空|
#|17179869184 | 25-03-2018 |采购| 112 |空|空|
#|34359738368 | 26-03-2018 |返回| 113 | 111 |空|
#|42949672960 | 26-03-2018 |购买| 111 |空| 113|
#|42949672960 | 26-03-2018 |购买| 111 |空|空|
#+-----------+----------+--------+---+------+--------+
我们就快到了,但正如你所看到的,还有两件事需要做
id
中的值为null
的行填写group\u id
窗口
函数创建一个名为rowNum
的临时列。这将是由布尔条件组id为NULL
排序的每个索引的值
对于有多行的索引值,已设置组id
的索引值将首先排序。因此,我们只需要选择