我正在尝试在一个非常大的数据集上运行非线性回归 (NLR)。对于较小的测试数据集,我在 R 中有工作代码,我正在尝试将其移植到 SparkR。
我是 Spark(R 和其他)的新手。
R(我的工作代码):
经过一些操作,我获得了 R-DataFramedf
并运行以下 NLR:
nls(y1 ~ b0/(1+exp(b1+b2*y2+b3*y3)),df)
火花:
在使用 csv-package ( $ sparkR --packages com.databricks:spark-csv_2.11:1.3.0
) 启动 SparkR 后,我设法创建了 SparkR-DataFrame 并运行线性回归作为测试用例
customSchema <- structType(...)
spk_df = read.df(sqlContext, path, header='true', source = "com.databricks.spark.csv", schema=customSchema)
test_linear_model <- glm(y1 ~ y2 + y3, data = spk_df)
summary(test_linear_model)
(旁注:我必须创建 customSchema 因为 inferSchema 总是转换为字符串而不是双精度)
- 如何在 SparkR 中运行 NLR?是否有可能或者非线性是否必然排除 Sparks 的并行化魔力?
- 我假设仅收集 spark-df 没有任何好处
nls(y1 ~ b0/(1+exp(b1+b2*y2+b3*y3)),collect(spk_df))
回到 R:
如果非线性会阻止我以有用的方式使用 spark,我应该如何处理大型数据集的 NLR?
我试过使用 rff
包,特别是 ff-data.frames ffdf
,但我想我遇到了麻烦,原因与 sparkR 失败的原因相同。
我原则上可以处理随机选择的数据行,就像这样 SO,但我的数据框实际上是通过操作多个文件/数据框创建的,我需要从每个文件中选择相同的随机行。我已经能够生成这些随机文件
$ dd if=/dev/random of=rsource count=150000
$ N=500000
$ gshuf -n $N --random-source rsource first.csv > first_sample.csv
$ gshuf -n $N --random-source rsource second.csv > second_sample.csv
$ gshuf -n $N --random-source rsource third.csv > third_sample.csv
有更好的解决方案吗?这让我有点紧张,因为虽然原则上文件应该都是相同的行数/顺序,但我担心有时可能会有不好的图像。
想法?
谢谢!!!