使用SparkR,如何将字符串列拆分为'n'个多列?

时间:2016-03-10 14:26:34

标签: r apache-spark dataframe apache-spark-sql sparkr

我正在使用SparkR 1.6,我有一个数百万行的dataFrame。其中一个名为“categories”的df列包含具有以下模式的字符串:

      categories
1 cat1,cat2,cat3
2      cat1,cat2
3     cat3, cat4
4           cat5

我想拆分每个字符串并创建«n»个新列,其中«n»是可能类别的数量(这里n = 5,但实际上它可能超过50)。
每个新列将包含类别存在/不存在的布尔值,例如:

   cat1  cat2  cat3  cat4  cat5
1  TRUE  TRUE  TRUE FALSE FALSE
2  TRUE  TRUE FALSE FALSE FALSE
3 FALSE FALSE  TRUE  TRUE FALSE
4 FALSE FALSE FALSE FALSE  TRUE

如何仅使用sparkR api执行此操作?

感谢您的时间。
问候。

1 个答案:

答案 0 :(得分:3)

让我们从导入和虚拟数据开始:

library(magrittr)

df <- createDataFrame(sqlContext, data.frame(
  categories=c("cat1,cat2,cat3", "cat1,cat2", "cat3,cat4", "cat5")
))

单独的字符串:

separated <- selectExpr(df, "split(categories, ',') AS categories")

获得不同的类别:

categories <- select(separated, explode(separated$categories)) %>% 
  distinct() %>% 
  collect() %>%
  extract2(1)

构建表达式列表:

exprs <- lapply(
  categories, function(x) 
  alias(array_contains(separated$categories, x), x)
)

选择并检查结果

select(separated, exprs) %>% head()
##    cat1  cat2  cat3  cat4  cat5
## 1  TRUE  TRUE  TRUE FALSE FALSE
## 2  TRUE  TRUE FALSE FALSE FALSE
## 3 FALSE FALSE  TRUE  TRUE FALSE
## 4 FALSE FALSE FALSE FALSE  TRUE