how is lazy evaluation handled in pyspark