ITPub博客

首页 > 大数据 > > R语言sparklyr:拆分字符串、分行、分列

R语言sparklyr:拆分字符串、分行、分列

作者:格伯纳 时间:2020-05-09 15:14:10 0 删除 编辑

最近沉迷于学习sparklyr。看标题就知道,今天讲的是如何手撕数据。

这次会用到一个sparklyr扩展包:

Function reference​mitre.github.io

首先读取数据:

conf <- spark_config()
conf$spark.executor.memory <- "16GB"
conf$spark.memory.fraction <- 0.9
conf$spark.executor.cores <- 4
conf$spark.dynamicAllocation.enabled <- "false"

sc <- spark_connect(master="spark://127.0.1.1:7077", 
                    version = "2.3.2",
                    config = conf,
                    spark_home = "/home/spark/spark-2.3.2-bin-hadoop2.7/")


test<-spark_read_parquet(sc, 
                         path = '/home/spark_test_file',
                         memory = F)
> test
# Source: spark<?> [?? x 2]
     V17 V18                                                            
   <int> <chr>                                                          
 1    41 12150.3112-3                                                   
 2  1394 12150.3112-14|12150.3113-93|12149.3113-201                     
 3   747 12150.3113-105|12149.3113-34                                   
 4   605 12149.3113-47 

步骤有两个:1. 根据“|”符号把V18每行分成多个元素的list,再根据每行V18中元素数量,一行拆成多行,也就是unnest;2. 根据“-”符号把拆成多行的V18分成两列。

首先执行第一步:

> test2<-test %>%
+   mutate(V18 = split(V18, '\\\\|')) %>%
+   sdf_explode('V18')
> test2 %>% select(V17,V18)
# Source: spark<?> [?? x 2]
     V17 V18           
   <int> <chr>         
 1    41 12150.3112-3  
 2  1394 12150.3112-14 
 3  1394 12150.3113-93 
 4  1394 12149.3113-201

这里只能用split来拆分,strsplit、str_split等函数都不适用。需要注意的是,在sparklyr中使用split且避免程序将符号识别为正则表达式,需要加4个反斜杠(“\\\\”)。之后用sparklyr.nested中的sdf_explode完成unnest操作。

参考资料:stackoverflow.com/quest

第二步比较简单,用sparklyr自带函数就行:

> test3<-test2 %>%
+   mutate(V18 = split(V18, '-')) %>%
+   sdf_separate_column('V18', into = c('V19','V20'))
> test3 %>% select(V19,V20)
# Source: spark<?> [?? x 2]
   V19        V20  
   <chr>      <chr>
 1 12150.3112 3    
 2 12150.3112 14   
 3 12150.3113 93   
 4 12149.3113 201  
 5 12150.3113 105  

搞定。改天再来研究怎么把拆开的数据再拼回去。

最后,用data.table完成相同操作,来个速度对比:

> system.time({
+   test2<-test %>%
+     mutate(V18 = split(V18, '\\\\|')) %>%
+     sdf_explode('V18') %>%
+     mutate(V18 = split(V18, '-')) %>%
+     sdf_separate_column('V18', into = c('V19','V20'))
+   print(test2 %>% select(V19,V20))
+ })
# Source: spark<?> [?? x 2]
   V19        V20  
   <chr>      <chr>
 1 12150.3112 3    
 2 12150.3112 14   
 3 12150.3113 93   
 4 12149.3113 201  
 5 12150.3113 105  
 6 12149.3113 34   
 7 12149.3113 47   
 8 12149.3113 14   
 9 12148.3113 132  
10 12146.3112 62   
# … with more rows
   user  system elapsed 
  0.162   0.001   1.093 

> system.time({
+   dt2<-data.table(dt)[,.(V18 = unlist(strsplit(V18, split = '\\|')))]
+   dt2[,c('V19','V20'):=data.table(str_split(V18, pattern = '-', simplify = T))]
+   print(dt2[,.(V19,V20)])
+ })
                V19 V20
      1: 12150.3112   3
      2: 12150.3112  14
      3: 12150.3113  93
      4: 12149.3113 201
      5: 12150.3113 105
     ---               
1768545: 12130.3112  45
1768546: 12130.3113  90
1768547: 12129.3114  71
1768548: 12129.3115  19
1768549: 12128.3115  45
   user  system elapsed 
  4.795   0.000   4.793 

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31509949/viewspace-3131359/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: Oracle 的Redo 机制
请登录后发表评论 登录
全部评论
管理员

注册时间:2018-03-30

  • 博文量
    2383
  • 访问量
    983936