2017-06-03 45 views
1

我不幸地被客户端给出了非常混乱和非常大的表格(csv)。它在宽格式:“(在Cassandra中将宽表转换为长格式

作为一个例子,列:

Name, Date, Usage_Hr1, Usage_Hr2, ..., Usage_Hr24, ... lots more columns 

我通常只将.csv装入R和使用gathertidyr包,但数据量太大。我已经考虑将数据加载到sparklyr,但没有gather功能sparklyr尚未...

所以我的问题是,一旦我COPY代管我的表到卡桑德拉(设置PRIMARY KEY姓名及日期) ,ho我可以将这些列转换为长格式吗?我只是运气不好?我不是一个数据库人,所以我不知道这里。

注意我使用的是最新版本的卡桑德拉和我现在的表是约1000万行。

+0

1000万行和多少列? – Uwe

+0

46列在数据集中。理想情况下,我可以为客户信息制作一张表格,然后再制作一张表格用于使用 – Zafar

回答

1

在Spark中您可以使用explode函数,but compared to support APIs,这样做有点涉及sparklyr

初始化和数据。例如:

library(stringi) 

sc <- spark_connect("local[*]") 
df <- data.frame(A = c("a", "b", "c"), B = c(1, 3, 5), C = c(2, 4, 6)) 
sdf <- copy_to(sc, df, overwrite =TRUE) 

Helper函数:

#' Given name, return corresponding SQL function 
sqlf <- function(f) function(x, ...) { 
    invoke_static(sc, "org.apache.spark.sql.functions", f, x, ...) 
} 

熔体功能:

#' @param df tbl_spark 
#' @param sc spark_connection 
#' @param id_vars id columns 
#' 
melt <- function(df, sc, id_vars, value_vars = NULL, 
    var_name = "key", value_name = "value") { 
    # Alias for the output view 
    alias <- paste(deparse(substitute(df)), stri_rand_strings(1, 10), sep = "_") 
    # Get session and JVM object 
    spark <- spark_session(sc) 
    jdf <- spark_dataframe(df) 

    # Convert characters to JVM Columns 
    j_id_vars <- lapply(id_vars, sqlf("col")) 

    # Combine columns into array<struct<key,value>> and explode 
    exploded <- sqlf("explode")(sqlf("array")(lapply(value_vars, function(x) { 
    key <- sqlf("lit")(x) %>% invoke("alias", var_name) 
    value <- sqlf("col")(x) %>% invoke("alias", value_name) 
    sqlf("struct")(list(key, value)) 
    }))) 

    # expand struct<..., struct<key, value>> into struct<..., key, value> 
    exprs <- lapply(
    c(id_vars, paste("col", c(var_name, value_name), sep = ".")), 
    sqlf("col")) 

    # Explode and register as temp table 
    jdf %>% 
    invoke("withColumn", "col", exploded) %>% 
    invoke("select", exprs) %>% 
    invoke("createOrReplaceTempView", alias) 

    dplyr::tbl(sc, alias) 
} 

实例:

melt(sdf, sc, "A", c("B", "C")) 

## Source: query [6 x 3] 
## Database: spark connection master=local[*] app=sparklyr local=TRUE 
## 
## # A tibble: 6 x 3 
##  A key value 
## <chr> <chr> <dbl> 
## 1  a  B  1 
## 2  a  C  2 
## 3  b  B  3 
## 4  b  C  4 
## 5  c  B  5 
## 6  c  C  6 
相关问题