Github user jkbradley commented on a diff in the pull request:

    https://github.com/apache/spark/pull/20633#discussion_r175963464
  
    --- Diff: mllib/src/main/scala/org/apache/spark/ml/util/ReadWrite.scala ---
    @@ -351,27 +359,88 @@ private[ml] object DefaultParamsReader {
           timestamp: Long,
           sparkVersion: String,
           params: JValue,
    +      defaultParams: JValue,
           metadata: JValue,
           metadataJson: String) {
     
    +
    +    private def getValueFromParams(params: JValue): Seq[(String, JValue)] 
= {
    +      params match {
    +        case JObject(pairs) => pairs
    +        case _ =>
    +          throw new IllegalArgumentException(
    +            s"Cannot recognize JSON metadata: $metadataJson.")
    +      }
    +    }
    +
         /**
          * Get the JSON value of the [[org.apache.spark.ml.param.Param]] of 
the given name.
          * This can be useful for getting a Param value before an instance of 
`Params`
    -     * is available.
    +     * is available. This will look up `params` first, if not existing 
then looking up
    +     * `defaultParams`.
          */
         def getParamValue(paramName: String): JValue = {
           implicit val format = DefaultFormats
    -      params match {
    +
    +      // Looking up for `params` first.
    +      var pairs = getValueFromParams(params)
    +      var foundPairs = pairs.filter { case (pName, jsonValue) =>
    +        pName == paramName
    +      }
    +      if (foundPairs.length == 0) {
    +        // Looking up for `defaultParams` then.
    +        pairs = getValueFromParams(defaultParams)
    +        foundPairs = pairs.filter { case (pName, jsonValue) =>
    +          pName == paramName
    +        }
    +      }
    +      assert(foundPairs.length == 1, s"Expected one instance of Param 
'$paramName' but found" +
    +        s" ${foundPairs.length} in JSON Params: " + 
pairs.map(_.toString).mkString(", "))
    +
    +      foundPairs.map(_._2).head
    +    }
    +
    +    /**
    +     * Extract Params from metadata, and set them in the instance.
    +     * This works if all Params (except params included by `skipParams` 
list) implement
    +     * [[org.apache.spark.ml.param.Param.jsonDecode()]].
    +     *
    +     * @param skipParams The params included in `skipParams` won't be set. 
This is useful if some
    +     *                   params don't implement 
[[org.apache.spark.ml.param.Param.jsonDecode()]]
    +     *                   and need special handling.
    +     */
    +    def getAndSetParams(
    +        instance: Params,
    +        skipParams: Option[List[String]] = None): Unit = {
    +      setParams(instance, false, skipParams)
    --- End diff --
    
    style nit: It's nice to pass boolean args by name


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscr...@spark.apache.org
For additional commands, e-mail: reviews-h...@spark.apache.org

Reply via email to