Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,8 @@ class PythonMLLibAPI extends Serializable {
trainFunc: (RDD[LabeledPoint], Vector) => GeneralizedLinearModel,
dataBytesJRDD: JavaRDD[Array[Byte]],
initialWeightsBA: Array[Byte]): java.util.LinkedList[java.lang.Object] = {
val data = dataBytesJRDD.rdd.map(SerDe.deserializeLabeledPoint)
// Cache deserialized RDD for iterative learning. SPARK-3488
val data = dataBytesJRDD.rdd.map(SerDe.deserializeLabeledPoint).cache()
val initialWeights = SerDe.deserializeDoubleVector(initialWeightsBA)
val model = trainFunc(data, initialWeights)
val ret = new java.util.LinkedList[java.lang.Object]()
Expand Down Expand Up @@ -248,7 +249,8 @@ class PythonMLLibAPI extends Serializable {
maxIterations: Int,
runs: Int,
initializationMode: String): java.util.List[java.lang.Object] = {
val data = dataBytesJRDD.rdd.map(bytes => SerDe.deserializeDoubleVector(bytes))
// Cache deserialized RDD for iterative learning. SPARK-3488
val data = dataBytesJRDD.rdd.map(bytes => SerDe.deserializeDoubleVector(bytes)).cache()
val model = KMeans.train(data, k, maxIterations, runs, initializationMode)
val ret = new java.util.LinkedList[java.lang.Object]()
ret.add(SerDe.serializeDoubleMatrix(model.clusterCenters.map(_.toArray)))
Expand Down
2 changes: 1 addition & 1 deletion python/pyspark/mllib/_common.py
Original file line number Diff line number Diff line change
Expand Up @@ -428,7 +428,7 @@ def _get_initial_weights(initial_weights, data):
# _regression_train_wrapper is responsible for setup and error checking.
def _regression_train_wrapper(sc, train_func, klass, data, initial_weights):
initial_weights = _get_initial_weights(initial_weights, data)
dataBytes = _get_unmangled_labeled_point_rdd(data)
dataBytes = _get_unmangled_labeled_point_rdd(data, cache=False)
ans = train_func(dataBytes, _serialize_double_vector(initial_weights))
if len(ans) != 2:
raise RuntimeError("JVM call result had unexpected length")
Expand Down
2 changes: 1 addition & 1 deletion python/pyspark/mllib/classification.py
Original file line number Diff line number Diff line change
Expand Up @@ -242,7 +242,7 @@ def train(cls, data, lambda_=1.0):
@param lambda_: The smoothing parameter
"""
sc = data.context
dataBytes = _get_unmangled_labeled_point_rdd(data)
dataBytes = _get_unmangled_labeled_point_rdd(data, cache=False)
ans = sc._jvm.PythonMLLibAPI().trainNaiveBayes(dataBytes._jrdd, lambda_)
return NaiveBayesModel(
_deserialize_double_vector(ans[0]),
Expand Down
4 changes: 2 additions & 2 deletions python/pyspark/mllib/clustering.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
_get_unmangled_rdd, _get_unmangled_double_vector_rdd, _squared_distance, \
_serialize_double_matrix, _deserialize_double_matrix, \
_serialize_double_vector, _deserialize_double_vector, \
_get_initial_weights, _serialize_rating, _regression_train_wrapper
_get_initial_weights, _serialize_rating
from pyspark.mllib.linalg import SparseVector

__all__ = ['KMeansModel', 'KMeans']
Expand Down Expand Up @@ -85,7 +85,7 @@ class KMeans(object):
def train(cls, data, k, maxIterations=100, runs=1, initializationMode="k-means||"):
"""Train a k-means clustering model."""
sc = data.context
dataBytes = _get_unmangled_double_vector_rdd(data)
dataBytes = _get_unmangled_double_vector_rdd(data, cache=False)
ans = sc._jvm.PythonMLLibAPI().trainKMeansModel(
dataBytes._jrdd, k, maxIterations, runs, initializationMode)
if len(ans) != 1:
Expand Down
8 changes: 4 additions & 4 deletions python/pyspark/mllib/recommendation.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@
_get_unmangled_rdd, _get_unmangled_double_vector_rdd, \
_serialize_double_matrix, _deserialize_double_matrix, \
_serialize_double_vector, _deserialize_double_vector, \
_get_initial_weights, _serialize_rating, _regression_train_wrapper, \
_serialize_tuple, RatingDeserializer
_get_initial_weights, _serialize_rating, _serialize_tuple, \
RatingDeserializer
from pyspark.rdd import RDD

__all__ = ['MatrixFactorizationModel', 'ALS']
Expand Down Expand Up @@ -65,15 +65,15 @@ class ALS(object):
@classmethod
def train(cls, ratings, rank, iterations=5, lambda_=0.01, blocks=-1):
sc = ratings.context
ratingBytes = _get_unmangled_rdd(ratings, _serialize_rating)
ratingBytes = _get_unmangled_rdd(ratings, _serialize_rating, cache=False)
mod = sc._jvm.PythonMLLibAPI().trainALSModel(
ratingBytes._jrdd, rank, iterations, lambda_, blocks)
return MatrixFactorizationModel(sc, mod)

@classmethod
def trainImplicit(cls, ratings, rank, iterations=5, lambda_=0.01, blocks=-1, alpha=0.01):
sc = ratings.context
ratingBytes = _get_unmangled_rdd(ratings, _serialize_rating)
ratingBytes = _get_unmangled_rdd(ratings, _serialize_rating, cache=False)
mod = sc._jvm.PythonMLLibAPI().trainImplicitALSModel(
ratingBytes._jrdd, rank, iterations, lambda_, blocks, alpha)
return MatrixFactorizationModel(sc, mod)
Expand Down
6 changes: 2 additions & 4 deletions python/pyspark/mllib/tree.py
Original file line number Diff line number Diff line change
Expand Up @@ -157,15 +157,14 @@ def trainClassifier(data, numClasses, categoricalFeaturesInfo,
:return: DecisionTreeModel
"""
sc = data.context
dataBytes = _get_unmangled_labeled_point_rdd(data)
dataBytes = _get_unmangled_labeled_point_rdd(data, cache=False)
categoricalFeaturesInfoJMap = \
MapConverter().convert(categoricalFeaturesInfo,
sc._gateway._gateway_client)
model = sc._jvm.PythonMLLibAPI().trainDecisionTreeModel(
dataBytes._jrdd, "classification",
numClasses, categoricalFeaturesInfoJMap,
impurity, maxDepth, maxBins)
dataBytes.unpersist()
return DecisionTreeModel(sc, model)

@staticmethod
Expand All @@ -188,15 +187,14 @@ def trainRegressor(data, categoricalFeaturesInfo,
:return: DecisionTreeModel
"""
sc = data.context
dataBytes = _get_unmangled_labeled_point_rdd(data)
dataBytes = _get_unmangled_labeled_point_rdd(data, cache=False)
categoricalFeaturesInfoJMap = \
MapConverter().convert(categoricalFeaturesInfo,
sc._gateway._gateway_client)
model = sc._jvm.PythonMLLibAPI().trainDecisionTreeModel(
dataBytes._jrdd, "regression",
0, categoricalFeaturesInfoJMap,
impurity, maxDepth, maxBins)
dataBytes.unpersist()
return DecisionTreeModel(sc, model)


Expand Down