2017-03-10 5 views
1

나는 더미 변수로 열 무리를 변환 해요. 데이터 프레임에서 원래의 범주 형 변수를 제거하려고합니다. 나는 스파크 릴에서 어떻게하는지 알아 내려고 애 쓰고있다. dplyr에서는 간단하지만 darker 기능은 sparklyr에서 작동하지 않습니다.무엇 열 데이터 형식을 기반으로 스파크 데이터 프레임 (sparklyr) 하위 집합에 가장 좋은 방법입니다

###create dummy data to figure out how model matrix formulas work in sparklyr 
v1 <- sample(LETTERS[1:4], 50000, replace=TRUE, prob=c(0.1, 0.2, 0.65, 0.05)) 
v2 <- sample(LETTERS[5:6], 50000, replace=TRUE, prob=c(0.7,0.3)) 
v3 <- sample(LETTERS[7:10], 50000, replace=TRUE, prob=c(0.3, 0.2, 0.4, 0.1)) 
v4 <- sample(LETTERS[11:15], 50000, replace=TRUE, prob=c(0.1, 0.1, 0.3, 0.05,.45)) 
v5 <- sample(LETTERS[16:17], 50000, replace=TRUE, prob=c(0.4,0.6)) 
v6 <- sample(LETTERS[18:21], 50000, replace=TRUE, prob=c(0.1, 0.1, 0.65, 0.15)) 
v7 <- sample(LETTERS[22:26], 50000, replace=TRUE, prob=c(0.1, 0.2, 0.65, 0.03,.02)) 
v8 <- rnorm(n=50000,mean=.5,sd=.1) 
v9 <- rnorm(n=50000,mean=5,sd=3) 
v10 <- rnorm(n=50000,mean=3,sd=.5) 
response <- rnorm(n=50000,mean=10,sd=2) 

dat <- data.frame(v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,response) 
write.csv(dat,file='fake_dat.csv',row.names = FALSE) 

#push "fake_dat" to the hdfs 

library(dplyr) 
library(sparklyr) 
#configure the spark session and connect 
config <- spark_config() 
config$`sparklyr.shell.driver-memory` <- "2G" #change depending on the size of the data 
config$`sparklyr.shell.executor-memory` <- "2G" 

# sc <- spark_connect(master='local', spark_home='/usr/hdp/2.5.0.0-1245/spark',config = config) 
# sc 

sc <- spark_connect(master='yarn-client', spark_home='/usr/hdp/2.5.0.0-1245/spark',config = config) 
sc 

#can also set spark_home as '/usr/hdp/current/spark-client' 

#read in the data from the hdfs 
df <- spark_read_csv(sc,name='fdat',path='hdfs://pnhadoop/user/stc004/fake_dat.csv') 

#create spark table 
dat <- tbl(sc,'fdat') 

지금 더미 변수를 만들 :

먼저 스파크 dataframe 만들 : 예를 들어

for(i in 1:7){ 
    dat <- ml_create_dummy_variables(x=dat,colnames(dat)[i], reference = NULL) 
} 

단순히 사용하여 원래 범주 변수를 삭제할 수를

drop.cols <- colnames(dat)[1:7] 
dat1 <- 
    dat %>% 
    select(-one_of(drop.cols)) 

그러나 실제로 작업하는 데이터에는 300 개의 범주 형 변수가 있습니다. 문자/요인 인 열을 식별하는 빠른 방법이 필요합니다. 해당 열을 더미 변수로 변환 한 후 원래의 범주 형 변수를 제거 할 수 있습니다. 나는 해봤 다음

test <- 
    dat %>% 
    select_if(is.character) 

그때 다음과 같은 오류 얻을 :

Error: Selection with predicate currently require local sources 

나는 또한 시도했다 :

cls <- sapply(dat, class) 
cls 

을하지만 수 :

> cls 

     src   ops 
    [1,] "src_spark" "op_base_remote" 
    [2,] "src_sql" "op_base" 
    [3,] "src"  "op" 

방법에 대한 아이디어가 있으십니까? 이 "최고는"스트레칭 것이다 그러나이 같은 시도 할 수 있습니다 호출

답변

2

(purr은 편의를 위해 사용된다) :

로 사용할 수 있습니다
columns_for_type <- function(sc, name, type="StringType") { 
    spark_session(sc) %>% 
    invoke("table", name) %>% 
    # Get (name, type) tuples 
    invoke("dtypes") %>% 
    # Filter by type 
    purrr::keep(function(x) invoke(x, "_2") == type) %>% 
    purrr::map(function(x) invoke(x, "_1")) 
} 

은 다음과 같습니다

library(sparklyr) 
library(dplyr) 

sc <- spark_connect(master = "local[*]") 
iris_tbl <- copy_to(sc, iris, name="iris", overwrite=TRUE) 

columns_for_type(sc, "iris", "StringType") 
[[1]] 
[1] "Species" 
columns_for_type(sc, "iris", "DoubleType") 
[[1]] 
[1] "Sepal_Length" 

[[2]] 
[1] "Sepal_Width" 

[[3]] 
[1] "Petal_Length" 

[[4]] 
[1] "Petal_Width" 

결과가 될 수있다 당신은 data.frame으로 단일 행을 고려하여 유사한 접근 방법을 사용할 수

iris_tbl %>% select_(.dots=columns_for_type(sc, "iris", "StringType")) 
Source: query [150 x 1] 
Database: spark connection master=local[8] app=sparklyr local=TRUE 

    Species 
    <chr> 
1 setosa 
2 setosa 
3 setosa 
4 setosa 
5 setosa 
6 setosa 
7 setosa 
8 setosa 
9 setosa 
10 setosa 
# ... with 140 more rows 

: select_에 전달

iris_tbl %>% head(n=1) %>% as.data.frame %>% lapply(class) 

을하지만 추가 스파크 조치를 필요로한다.