记录一下最近学习sparklyr的操作及问题。
读取数据
- 读取csv数据时,设置列属性需要指定列名,例如:
> columns<-c('character','integer64','double','double','timestamp',
+ 'double','double','timestamp',
+ rep('integer',3),'character',
+ 'integer','integer','double','double','integer','character','character')
> names(columns)<-paste0('V',1:19)
> columns
V1 V2 V3 V4 V5 V6 V7 V8
"character" "integer64" "double" "double" "timestamp" "double" "double" "timestamp"
V9 V10 V11 V12 V13 V14 V15 V16
"integer" "integer" "integer" "character" "integer" "integer" "double" "double"
V17 V18 V19
"integer" "character" "character"
> dynamic<-spark_read_csv(sc,
+ path = paste0(cachework,'/',i,'/part-*'),
+ header = F,
+ memory = F,
+ name = 'dynamic',
+ columns = columns)
不这么做的话会报错。此外,若读取的数据有内置的元数据,上面指定列属性的方法无效,请参考:https://stackoverflow.com/questions/45283913/sparklyr-how-to-change-the-parquet-data-types
(2020/7/11更新)强烈建议设置列属性,读取大文件的速度会快非常多。
- 要查看处理过的列有没有报错,可以用sdf_read_column(raw, 'X8')
- 写入数据尽量不要指定已存在的目录及文件,以免发生意外。例如spark_write_csv()中,mode设置为overwrite的话,会把输出文件/目录完全覆盖。
查看程序进度
在Rstudio中输入spark_web(sc)可以查看spark进程界面,在集群模式中,可以到master的web ui查看,一个简单的开启方法是使用局域网内电脑,打开浏览器输入spark设备ip:端口号(端口默认8080),例如192.154.4.40:8080。
启动集群模式,以Standalone模式为例
除了local模式之外,所有模式都要用户在设备上先启动spark。下面是一个linux的示例。
首先找到你安装spark的目录,例如/home/spark/spark-2.3.2-bin-hadoop2.7。进去之后会看到一些目录:
找到conf目录下的spark-env.sh.template脚本,复制,重命名为spark-env.sh:
用vi编辑器打开,点击i进入编辑模式,在空行添加变量:
保存,回到spark的主目录,进入sbin目录,运行start-allsh。
这样spark就启动了,要停止的话,同个目录还有个stop-all.sh,运行便可。
回到Rstudio,加载sparklyr,运行以下代码:
> 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/")
此时才可以使用Standalone模式。
参考资料:https://www.jianshu.com/p/b4d3db386925
spark_apply
基本上,这个函数的用法与apply没啥区别,但不同的是,无法将Spark DataFrame对象传入apply函数中:https://stackoverflow.com/questions/52753792/sparklyr-cannot-reference-table-in-spark-apply
来回试了好多遍,无论是Spark DataFrame还是R对象都不能像普通apply那样传入spark_apply。这个问题挺烦的,如果计算涉及不同对象的合并,那可能就没法用spark_apply来计算。
待续