Hi,

I have an example where I use a tuple of (int,int) in Python as key for a
RDD. When I do a reduceByKey(...), sometimes the tuples turn up with the
two int's reversed in order (which is problematic, as the ordering is part
of the key).

Here is a ipython notebook that has some code and demonstrates this issue:
http://nbviewer.ipython.org/urls/dl.dropboxusercontent.com/u/5812021/test-on-cluster.ipynb?create=1

Here's the long story... I am doing collaborative filtering using cosine
similarity on Spark using Python. Not because I need it, but it seemed like
a appropriately simple but useful exercise to get started with Spark.

I am seeing a difference in outcomes between running locally and running on
a cluster.

My approach is this:

   - given a dataset containing tuples of (user, item, rating)
   - group by user
   - for each user flatMap into tuples of ((item, item), (rating, rating))
   for each combination of two items that that user has seen
   - then map into a structure containing ((item, item), (rating * rating,
   left rating ^ 2, right rating ^ 2, 1)
   - then reduceByKey, summing up the values in the tuples column-wise;
   this gives a tuple of (sum of rating product, sum of left rating squares,
   sum of right rating square, co-occurrence count) which can be used to
   calculate cosine similarity.
   - map into (item,item), (similarity, count)
   - this should result in a dataset that looks like: (item, item),
   (similarity, count)

(In the notebook I leave out the final step of converting the sums into a
cosine similarity.)

When I do this for a artificial dataset of 100000 users with each 70 items
rated that are exactly the same for each user (so 7M ratings in total where
the user,item matrix is dense), I would expect the resulting dataset to
have 2415 tuples (== 70*69 / 2, the number of co-occurrences that exist
amongst 70 items that each user has rated) and I would expect the
co-occurrence count for each item,item pair to be 100000, as there are 100K
users.

When I run my code locally, the above assumptions work out, but when I run
on a small cluster (4 workers, on AWS), the numbers are way off. This
happens because of the reversed tuples.

Where am I going wrong?


Thanks for any pointers, cheers,
Friso

Reply via email to