2016-10-07 10 views
0

무작위 포리스트 교육 집합의 클래스 레이블을 보유하고있는 데이터 프레임에 double 유형의 열이 있습니다.
another question에 제안 된대로 데이터 프레임을 StringIndexer으로 전달할 필요가 없도록 수동으로 메타 데이터를 열에 첨부하고 싶습니다.
이 작업을 수행하는 가장 쉬운 방법은 Columnas 메서드를 사용하는 것입니다.
그러나이 방법은 Python에서 사용할 수 없습니다.

쉬운 해결 방법이 있습니까?pyspark에서 이중 열에 메타 데이터를 첨부하는 방법

쉬운 해결 방법이없고 최선의 방법이 Python 포트 as 인 경우,이 방법은 왜 Python에서 이식되지 않습니까?
파이썬에서 as 키워드와 충돌하고 아무도 그것을 포팅하지 않았다는 이유만으로 어려운 기술적 인 이유가 있습니까?

source code을보고 파이썬에서 alias 메서드가 내부적으로 스칼라에서 as 메서드를 호출한다는 것을 알았습니다.

답변

1
import json 
from pyspark.sql.column import Column 

def add_meta(col, metadata): 
    meta = sc._jvm.org.apache.spark.sql.types\ 
      .Metadata.fromJson(json.dumps(metadata)) 
    return Column(getattr(col._jc, "as")('', meta)) 

# sample invocation 
df.withColumn('label', 
       add_meta(df.classification, 
         {"ml_attr": { 
          "name": "label", 
          "type": "nominal", 
          "vals": ["0.0", "1.0"] 
           } 
         }))\ 
    .show() 

이 솔루션은 파이썬에서 as(alias: String, metadata: Metadata) 스칼라 메소드를 호출 포함한다. getattr(col._jc, "as")으로 검색 할 수 있습니다. 여기서 col은 데이터 프레임 열 (Column 개체)입니다.

이렇게 반환 된 함수는 두 개의 인수를 사용하여 호출해야합니다. 첫 번째 인수는 문자열이며 두 번째 인수는 Metadata입니다. 이 객체는 JSON 문자열을 매개 변수로 요구하는 Metadata.fromJson()을 호출하여 만들어집니다. 이 메서드는 Spark 컨텍스트의 _jvm 특성을 통해 검색됩니다.