복붙노트

[SCALA] 스파크 벡터 열에 첨부 메타

SCALA

스파크 벡터 열에 첨부 메타

문맥: 라벨 및 기능 : 저는 두 열 데이터 프레임을 가지고있다.

org.apache.spark.sql.DataFrame = [label: int, features: vector]

어디를 특징으로 VectorAssembler를 사용하여 구축 숫자 유형의 mllib.linalg.VectorUDT입니다.

의문: 특징 벡터에 스키마를 지정할 수있는 방법이 있습니까? 나는 각 기능의 이름을 추적하고자합니다.

지금까지 시도 :

val defaultAttr = NumericAttribute.defaultAttr
val attrs = Array("feat1", "feat2", "feat3").map(defaultAttr.withName)
val attrGroup = new AttributeGroup("userFeatures", attrs.asInstanceOf[Array[Attribute]])
scala> attrGroup.toMetadata 
res197: org.apache.spark.sql.types.Metadata = {"ml_attr":{"attrs":{"numeric":[{"idx":0,"name":"f1"},{"idx":1,"name":"f2"},{"idx":2,"name":"f3"}]},"num_attrs":3}}

그러나 반드시 기존 데이터 프레임에이를 적용하는 방법이 아니었다.

해결법

  1. ==============================

    1.이 적어도 두 가지 옵션 :

    이 적어도 두 가지 옵션 :

    벡터 열이 상위 항목을 설명 VectorAssembler 칼럼 메타 데이터를 이용하여 생성 된 경우 이미 부착되어야한다.

    import org.apache.spark.ml.feature.VectorAssembler
    
    val raw = sc.parallelize(Seq(
      (1, 1.0, 2.0, 3.0)
    )).toDF("id", "feat1", "feat2", "feat3")
    
    val assembler = new VectorAssembler()
      .setInputCols(Array("feat1", "feat2", "feat3"))
      .setOutputCol("features")
    
    val dfWithMeta = assembler.transform(raw).select($"id", $"features")
    dfWithMeta.schema.fields(1).metadata
    
    // org.apache.spark.sql.types.Metadata = {"ml_attr":{"attrs":{"numeric":[
    //   {"idx":0,"name":"feat1"},{"idx":1,"name":"feat2"},
    //   {"idx":2,"name":"feat3"}]},"num_attrs":3}
    

    벡터 필드는 도트 구문 (같은 $ features.feat1)하지만 VectorSlicer 같은 전문 도구에서 사용 수를 사용하여 직접 액세스 할 수 없습니다 :

    import org.apache.spark.ml.feature.VectorSlicer
    
    val slicer = new VectorSlicer()
      .setInputCol("features")
      .setOutputCol("featuresSubset")
      .setNames(Array("feat1", "feat3"))
    
    slicer.transform(dfWithMeta).show
    // +---+-------------+--------------+
    // | id|     features|featuresSubset|
    // +---+-------------+--------------+
    // |  1|[1.0,2.0,3.0]|     [1.0,3.0]|
    // +---+-------------+--------------+
    

    PySpark를 들어 내가 용액에 사용하기 위해 DataFrame의 범주 기능으로 열을 선언 할 수 있습니다 방법을 참조하십시오

  2. from https://stackoverflow.com/questions/35305154/attach-metadata-to-vector-column-in-spark by cc-by-sa and MIT license