Pyspark RDD: găsiți indexul unui element (Programare, Python, Pyspark)

ahajib a intrebat.

Sunt nou în pyspark și încerc să convertesc o listă în python în rdd și apoi trebuie să găsesc indexul elementelor folosind rdd. Pentru prima parte pe care o fac:

list = [[1,2],[1,4]]
rdd = sc.parallelize(list).cache()

Deci, acum rdd este de fapt lista mea. Problema este că vreau să găsesc indexul oricărui element arbitrar, ceva de genul funcției „index” care funcționează pentru listele python. Cunosc o funcție numită zipWithIndex, care atribuie indexul fiecărui element, dar nu am putut găsi un exemplu adecvat în python (există exemple în java și scala).

Mulțumesc.

Comentarii

  • Prin element arbitrar, vă referiți la o sub-listă arbitrară, cum ar fi [1,2]? –  > Por Akshat Mahajan.
  • @AkshatMahajan da, la asta mă refer –  > Por ahajib.
  • Pentru înregistrare, există este un exemplu de zipWithIndex în Pyspark. –  > Por Akshat Mahajan.
1 răspunsuri
Akshat Mahajan

Utilizați filter și zipWithIndex:

rdd.zipWithIndex().
filter(lambda (key,index) : key == [1,2]).
map(lambda (key,index) : index).collect()

Rețineți că [1,2] aici poate fi schimbat cu ușurință într-un nume de variabilă și întreaga expresie poate fi inclusă într-o funcție.

Cum funcționează

zipWithIndex returnează pur și simplu un tuplu de (item,index), astfel:

rdd.zipWithIndex().collect()
> [([1, 2], 0), ([1, 4], 1)]

filter găsește numai cele care corespund unui anumit criteriu (în acest caz, că key este egal cu o anumită sublistă):

rdd.zipWithIndex().filter(lambda (key,index) : key == [1,2]).collect()
> [([1, 2], 0)]

map este destul de evident, putem obține înapoi doar indexul:

rdd.zipWithIndex().filter(lambda (key,index) : key == [1,2]).
map(lambda (key,index): index).collect()
> [0]

și apoi putem obține pur și simplu primul element prin indexare [0] dacă doriți.

Comentarii

  • Problema este că, atunci când adaug „rdd.zipWithIndex.collect()” la codul meu, acesta returnează următoarea eroare: „AttributeError: obiectul ‘function’ nu are atributul ‘collect'” –  > Por ahajib.
  • Tu – adică eu – ai uitat un (). Ar trebui să fie rdd.zipWithIndex().collect(). –  > Por Akshat Mahajan.
  • De asemenea, rețineți că collect va returna un listă. Dacă aveți un set de date cu adevărat masiv, vă implor să nu faceți collect ci luați mai întâi o mostră înainte de a apela collect(). –  > Por Akshat Mahajan.
  • @nimafl Răspuns actualizat cu codul corectat. Vă mulțumim pentru că ați prins asta 🙂 –  > Por Akshat Mahajan.
  • Vă mulțumim pentru că ați semnalat lucrul cu lista și pentru răspuns, de asemenea 🙂 –  > Por ahajib.