sparkR 与 SQL 相比慢
sparkR gapply SLOW compared with SQL
我有一个约 8 GB 的数据集,其中约有 1000 万行(约 10 列),并且想证明 SparkR 可以胜过 SQL 的观点。相反,与 SQL 相比,我发现 SparkR 的性能极差。
我的代码只是从 运行s 的 S3 加载文件,我的分组通常由 1-15 行组成——所以 1000 万行除以 15 得到很多组。 serialization/deserialization 我是不是强迫洗牌太多了?这就是 运行 如此缓慢的原因吗?
为了说明我的 build_transition 函数不是性能瓶颈,我创建了一个名为 build_transition2 的简单版本,如下所示,其中 returns 虚拟信息应该包含什么是每组的恒定执行时间。
我的解决方案公式有什么基本的或明显的吗?
build_transition2 <- function(key, x) {
patient_id <- integer()
seq_val <- integer()
patient_id <- append(patient_id, as.integer(1234))
seq_val <- append(seq_val, as.integer(5678))
y <- data.frame(patient_id,
seq_val,
stringsAsFactors = FALSE
)
}
dat_spark <- read.df("s3n://my-awss3/data/myfile.csv", "csv", header = "true", inferSchema = "true", na.strings = "NA")
schema <- structType(structField("patient_ID","integer"),
structField("sequence","integer")
)
result <- gapply(dat_spark, "patient_encrypted_id", build_transition2, schema)
and wanted to prove the point that SparkR could outperform SQL.
事实并非如此。来宾语言造成的间接开销:
- 内部催化剂格式
- 外部Java类型
- 正在向 R 发送数据
- .....
- 将数据发送回 JVM
- 正在转换为 Catalyst 格式
很大。
除此之外,gapply
基本上是一个按键分组的例子——我们在 Spark 中 normally avoid 的东西。
总体而言,当且仅当业务逻辑无法使用标准 SQL 函数表达时,才应使用 gapply
。这绝对不是在正常情况下优化代码的方法(可能会出现边界情况,它可能会更快,但一般来说,如果需要,任何特殊逻辑都会从使用 Scala UDF、UDAF、聚合器或聚合器的本机 JVM 执行中受益更多reduceGroups
/ mapGroups
).
我有一个约 8 GB 的数据集,其中约有 1000 万行(约 10 列),并且想证明 SparkR 可以胜过 SQL 的观点。相反,与 SQL 相比,我发现 SparkR 的性能极差。
我的代码只是从 运行s 的 S3 加载文件,我的分组通常由 1-15 行组成——所以 1000 万行除以 15 得到很多组。 serialization/deserialization 我是不是强迫洗牌太多了?这就是 运行 如此缓慢的原因吗?
为了说明我的 build_transition 函数不是性能瓶颈,我创建了一个名为 build_transition2 的简单版本,如下所示,其中 returns 虚拟信息应该包含什么是每组的恒定执行时间。
我的解决方案公式有什么基本的或明显的吗?
build_transition2 <- function(key, x) {
patient_id <- integer()
seq_val <- integer()
patient_id <- append(patient_id, as.integer(1234))
seq_val <- append(seq_val, as.integer(5678))
y <- data.frame(patient_id,
seq_val,
stringsAsFactors = FALSE
)
}
dat_spark <- read.df("s3n://my-awss3/data/myfile.csv", "csv", header = "true", inferSchema = "true", na.strings = "NA")
schema <- structType(structField("patient_ID","integer"),
structField("sequence","integer")
)
result <- gapply(dat_spark, "patient_encrypted_id", build_transition2, schema)
and wanted to prove the point that SparkR could outperform SQL.
事实并非如此。来宾语言造成的间接开销:
- 内部催化剂格式
- 外部Java类型
- 正在向 R 发送数据
- .....
- 将数据发送回 JVM
- 正在转换为 Catalyst 格式
很大。
除此之外,gapply
基本上是一个按键分组的例子——我们在 Spark 中 normally avoid 的东西。
总体而言,当且仅当业务逻辑无法使用标准 SQL 函数表达时,才应使用 gapply
。这绝对不是在正常情况下优化代码的方法(可能会出现边界情况,它可能会更快,但一般来说,如果需要,任何特殊逻辑都会从使用 Scala UDF、UDAF、聚合器或聚合器的本机 JVM 执行中受益更多reduceGroups
/ mapGroups
).