【问题标题】:Convert wide table to long format in Cassandra在 Cassandra 中将宽表转换为长格式
【发布时间】:2017-11-04 11:11:34
【问题描述】:

不幸的是,客户给了我一个非常凌乱且非常大的表格 (csv)。它是宽格式:'(

例如,这些列是:

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

我通常会将 .csv 加载到 R 并使用 tidyr 包中的 gather,但数据太大。我已经考虑将数据加载到sparklyr,但是sparklyr 中还没有gather 函数...

所以我的问题是,一旦我将 COPYed 我的表放入 Cassandra(将 PRIMARY KEY 设置为名称和日期),如何将这些列转换为长格式?我只是运气不好?顺便说一句,我不是数据库专家,所以我不知道。

注意我使用的是最新版本的 Cassandra,我当前的表大约有 1000 万行。

【问题讨论】:

  • 一千万行多少列?
  • 数据集中有 46 列。理想情况下,我可以为客户信息制作一张表格,然后再制作一张用于使用的表格

标签: r database apache-spark cassandra sparklyr


【解决方案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)

辅助函数:

#' 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-31
    • 1970-01-01
    相关资源
    最近更新 更多