2017-12-13 19 views
2

sparklyr의 클러스터링 문제를 해결하기 위해 노력하고 있습니다. 훈련 세트의 변수 중 많은 부분이 서로 다른 척도로 측정되므로 순서에 따라 다릅니다. 모범 사례에 따라 데이터를 확장하고 가운데에 맞추려고합니다.mutate_each를 사용하여 스파크리어의 변수를 크기 조절하고 가운데에 맞 춥니 다

X를 임의의 변수, μ = 평균 및 σ = 표준 편차로 표현하는 가장 일반적인 표현식 (X - μ)/σ가 여러 가지 있습니다. 나는 X = 무작위 변수, x = 샘플 평균, x_max = 최대 값, x_min = 최소값을 (X - x)/(x_max - x_min)로 사용하는 경향이있다.

dplyr을 사용하여이 변환을 적용한 후 이상한 결과가 나타납니다.

#connect to spark 
    library(sparklyr) 
    library(SparkR) 
    library(dplyr) 
    sc = spark_connect(master = 'yarn-client', 
         spark_home = '/usr/hdp/current/spark-client', 
         app_name = 'sparklyr' 
         # config = list(
         # "sparklyr.shell.executor-memory" = "XG", 
         # "sparklyr.shell.driver-memory" = "XG", 
         # "spark.driver.maxResultSize"  = "XG" # may need to transfer a lot of data into R 
    ) 

    sparkR.init() 

#create a dataframe where variables in the dataset differ by an order of magnitude 
mat <- as.data.frame(matrix(data = rnorm(200, mean=100,sd=10), nrow = 1000, ncol = 50)) 
mat1 <- as.data.frame(matrix(data = rnorm(200, mean=0,sd=1), nrow = 1000, ncol = 50)) 
colnames(mat1) <- paste('X',1:50,sep='') 
mat.final <- cbind(mat,mat1) 

#copy to Spark 
dat.out <- sdf_copy_to(sc,mat.final,'dat',overwrite=TRUE) 

#define centering and scaling function 
scale.center <- function(x){ 
    (x-mean(x,na.rm=TRUE)) /(max(x,na.rm = TRUE)-min(x,na.rm = TRUE)) 
} 

#scale data 
dat.out1 <- 
    dat.out %>% 
    mutate_each(funs(s=scale.center)) 

코드 실행,하지만 난 뭔가 이상한 얻을 :이 예제를 고려

str(dat.out1) 

$ ops:List of 4 
    ..$ name: chr "mutate" 
    ..$ x :List of 4 
    .. ..$ name: chr "mutate" 
    .. ..$ x :List of 4 
    .. .. ..$ name: chr "mutate" 
    .. .. ..$ x :List of 4 
    .. .. .. ..$ name: chr "mutate" 
    .. .. .. ..$ x :List of 4 
    .. .. .. .. ..$ name: chr "mutate" 
    .. .. .. .. ..$ x :List of 4 
    .. .. .. .. .. ..$ name: chr "mutate" 
    .. .. .. .. .. ..$ x :List of 4 
    .. .. .. .. .. .. ..$ name: chr "mutate" 
    .. .. .. .. .. .. ..$ x :List of 4 
    .. .. .. .. .. .. .. ..$ name: chr "mutate" 
    .. .. .. .. .. .. .. ..$ x :List of 4 
    .. .. .. .. .. .. .. .. ..$ name: chr "mutate" 
    .. .. .. .. .. .. .. .. ..$ x :List of 4 
    .. .. .. .. .. .. .. .. .. ..$ name: chr "mutate" 
    .. .. .. .. .. .. .. .. .. ..$ x :List of 4 
    .. .. .. .. .. .. .. .. .. .. ..$ name: chr "mutate" 
    .. .. 

은 위의 str를 실행 한 후 출력의 단지 부분입니다. 여기에 무슨 일이 일어나고 있는지 생각해보십시오. 센터링 및 스케일링 기능이 없다는 것에 놀랐습니다.

+0

'? scale'은 기본형과 함께 제공됩니다. – hrabel

+0

SparkR에서는 구현되지 않았습니다. – schristel

+0

아, 죄송합니다. 위의 코드에서 'scale'로 인해 오류가 발생합니까? 'mutate_each'가'mutate_all'을 위해 더 이상 사용되지 않을까요? 그게 뭔가 관련이 있는지 궁금합니다. – hrabel

답변

3

여기에 무슨 문제가 있는지 생각해보십시오. 윈도우 함수 실제로 완전히 쓸모이 방법을 (PARTITION BY 절은 제외) mutate에 사용되는 집계 함수가 글로벌로 확장됩니다 -

본질적으로 Sparklyr: how to center a Spark table based on column?과 동일한 문제입니다.

센터링 및 스케일링 기능이 내장되어 있지 않습니다.

음, 일반 스파크에 ML Transformers, sparklyr에 이식 된의 무리를 사용하여 운영하고 있습니다. 이들은 ft_ 접두어로 구별 할 수 있습니다. 죄송합니다. StandardScalerMinMaxScaler은 아직 이식되지 않았습니다. 자신의 인터페이스를 구현하는 것이 그리 어렵지 않습니다.

당신이있는 그대로 데이터를 사용할 수 있습니다 빠른하려면 다음

library(rlang) 
library(glue) 

# Compute all the stats at once 
stats <- dat.out %>% summarise_all(funs(avg, min, max)) %>% collect() 

# Separate stats into components 
cols <- dat.out %>% colnames() 
avgs <- stats %>% select(ends_with("avg")) %>% unlist 
mins <- stats %>% select(ends_with("min")) %>% unlist 
maxs <- stats %>% select(ends_with("max")) %>% unlist 

# Create expressions 
exprs <- glue("({cols} - {avgs})/({maxs} - {mins})") %>% 
    setNames(cols) %>% 
    lapply(parse_quosure) 

dat.out %>% mutate(!!! exprs) 

크레딧 다시 한번 Artem Sokolov (dplyr 0.7 equivalent for deprecated mutate_)로 이동합니다.

:

sparklyr 함께 사용할 수있는 기능 .을 사용하지 마십시오. dplyr은 이것을 "접두어"데이터베이스에서 데이터베이스 기능으로 일치 시키려고 시도하고 의도하지 않은 결과가 나오거나 실패합니다.

+0

이 솔루션과 관련된 유일한 문제는 확장 성이 좋지 않다는 것입니다. 내 ** 실제 ** 데이터에는 500 개의 열과 1200 만 개의 행이 있습니다. '통계 <- dat.out %> % summarise_all (funs (avg, min, max)) %> % collect()'가 이미 5 분 이상 실행되었습니다. – schristel

+0

5 분으로 1 시간을 의미 :/ – schristel

+0

데이터가 하이브 테이블에 있습니다. Spark R에 연결하기위한 설정은'sc = spark_connect (master = 'yarn-client', spark_home = '/ usr/hdp/current/spark-client', app_name = 'sparklyr', config = list ( )입니다. "sparklyr.shell.executor 메모리"= "24G" "sparklyr.shell.driver 메모리"= "16G" "spark.driver.maxResultSize"= "16G") ) sparkR.init ()'나는 dplyr 함수'tbl'를 사용하여 하이브의 데이터를 읽습니다. – schristel