皮斯帕克笛卡尔非常慢

2024-09-27 21:28:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从数据库中计算频繁项集。该数据库有31101个篮子和12592个项目。我能够得到频繁出现的项目,超过一些阈值。元素具有字符串数据类型(例如“FRO11987”)

现在,我正在尝试使用cartesian操作从这些频繁项形成一对。我得到735个频繁项,当我使用笛卡尔运算时,我希望它是一个快速运算

然而,形成这一对花的时间太长(超过20分钟)。我一定是在写pyspark代码时出错了。在这方面的任何帮助都将不胜感激。多谢各位

def get_sup(x):
  x_sup = 0
  for t in shared_itemset.value:
    if x.issubset(t):
    #if set({x}).issubset(set(t)):
      x_sup +=1
  if x_sup >= sup:
      return x, x_sup
  else:
      return ()

data = sc.textFile('browsing.txt')

itemset = data.map(lambda line: ([item for item in line.strip().split(' ')]))
shared_itemset = sc.broadcast(itemset.map(lambda x: frozenset(x)).collect())

c1 = data.flatMap(lambda line: line.strip().split(' ')).distinct()
c1 = c1.map(lambda x : frozenset({x}))
print(c1.count())----------------------------------------------- 12592

f1 = c1.map(get_sup).filter(lambda x: x)
print(f1.count())----------------------------------------------- 735

f1m = f1.map(lambda x: tuple(x[0]))
f1c = f1m.cartesian(f1m).map(lambda x: frozenset(x[0]+x[1])).filter(lambda x: len(x)>1).distinct()

print(f1c.count())

样本数据如下所示:

FRO11987 ELE17451 ELE89019 SNA90258 GRO99222 
GRO99222 GRO12298 FRO12685 ELE91550 SNA11465 ELE26917 ELE52966 FRO90334 SNA30755 ELE17451 FRO84225 SNA80192 
ELE17451 GRO73461 DAI22896 SNA99873 FRO86643 
ELE17451 ELE37798 FRO86643 GRO56989 ELE23393 SNA11465 
ELE17451 SNA69641 FRO86643 FRO78087 SNA11465 GRO39357 ELE28573 ELE11375 DAI54444 

我能够顺利地从上述数据中形成频繁项和配对。一旦数据很大(有31101个篮子),问题就开始出现。对于整个数据集,使用this file


Tags: 数据lambdamapdataifcountlinef1

热门问题