Apache spark pyspark rdd映射未调用函数

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

我试图在我的RDD上做一些转换,为此,我使用map调用了一个函数。但是,未调用此函数。有人请让我知道我做错了什么

我可以看到调用了
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
这就是它在商店中的工作方式:

  • 如果购买了某个项目,则会生成一个id
  • 如果您想从购买的物品中退回一些物品,则会输入两个条目

  • 退货条目,带有所有产品退货的新id,其中
    org\u id
    为您要退货的采购订单的
    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 |空|空|
    #+-----------+----------+--------+---+------+--------+
    
    我们就快到了,但正如你所看到的,还有两件事需要做

  • 我们需要消除索引=42949672960的重复行
  • 我们需要使用
    id
    中的值为
    null
    的行填写
    group\u id
  • 对于第一步,我们将使用
    窗口
    函数创建一个名为
    rowNum
    的临时列。这将是由布尔条件
    组id为NULL
    排序的每个
    索引的值

    对于有多行的索引值,已设置
    组id
    的索引值将首先排序。因此,我们只需要选择