2017-06-03 41 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 
相關問題