SparkR - 为R函数提取数据帧的数组<int>

时间:2016-01-12 22:12:59

标签: arrays r spark-dataframe sparkr

我有1000个传感器,我需要对数据进行分区(即每天每个传感器),然后将每个数据点列表提交给R算法)。使用Spark,简化的示例如下所示:

I0112 22:50:49.671303 114020 data_layer.cpp:104] Transform time: 0.791 ms.
I0112 22:50:49.672757 114020 data_layer.cpp:104] Transform time: 0.767 ms.
I0112 22:50:49.674334 114020 data_layer.cpp:104] Transform time: 0.836 ms.
I0112 22:50:49.675853 114020 data_layer.cpp:104] Transform time: 0.806 ms.
I0112 22:50:49.677273 114020 data_layer.cpp:104] Transform time: 0.762 ms.
I0112 22:50:49.678861 114020 data_layer.cpp:104] Transform time: 0.861 ms.
I0112 22:50:49.680376 114020 data_layer.cpp:104] Transform time: 0.821 ms.
I0112 22:50:49.681077 113921 solver.cpp:409]     Test net output #0: accuracy = 0.9902
I0112 22:50:49.681115 113921 solver.cpp:409]     Test net output #1: loss = 0.0292544 (* 1 = 0.0292544 loss)
I0112 22:50:49.681125 113921 solver.cpp:326] Optimization Done.
I0112 22:50:49.681133 113921 caffe.cpp:215] Optimization Done.
I0112 22:50:49.681948 114020 data_layer.cpp:104] Transform time: 0.829 ms.

我转换为镶木地板文件,保存。 在SparkR中加载镶木地板,没问题,架构说:

//Spark
val rddData = List(
 ("1:3", List(1,1,456,1,1,2,480,0,1,3,425,0)), 
 ("1:4", List(1,4,437,1,1,5,490,0)),
 ("1:6", List(1,6,500,0,1,7,515,1,1,8,517,0,1,9,522,0,1,10,525,0)),
 ("1:11", List(1,11,610,1))
)

case class DataPoint(
  key:  String,
  value:    List[Int])  // 4 value pattern, sensorID:seq#, seq#, value, state

所以在SparkR中,我有一个数据框,其中每条记录都包含我想要的所有数据(df $ value)。我想将该数组提取为R可以使用的内容然后使用包含结果数组的新列来改变我的原始数据帧(df)。逻辑上类似于results = function(df $ value)。然后我需要将结果(对于所有行)返回到SparkR数据帧中以进行输出。

如何从SparkR数据帧中提取数组,然后使用结果进行变异?

2 个答案:

答案 0 :(得分:0)

让火花数据框为df,R数据框为df_r  要将sparkR df转换为R df,请使用代码

df_r <- collect(df)

使用R数据框df_r,您可以在R中进行所有计算。 假设您在列df_r$result

中得到了结果
Then for converting back to SparkR data frame use code,
#this is a new SparkR data frame, df_1
df_1 <- createDataFrame(sqlContext, df_r) 

For adding the result back to SparkR data frame `df` use code
#this adds the df_1$result to a new column df$result 
#note that number of rows should be same in df and `df_1`, if not use `join` operation
df$result <- df_1$result 

希望这能解决您的问题

答案 1 :(得分:0)

我也有这个问题。我解决这个问题的方法是在spark DataFrame中添加一个行索引,然后在select语句中使用explode。确保在select语句中选择索引,然后选择所需的行。这将为您提供“长”数据帧。如果DataFrame列中的每个嵌套列表中都包含相同数量的信息(例如,如果您正在爆炸x,y坐标的列表列),则可以预期长数据框中的每个行索引都会出现两次。

完成上述操作后,我通常会在展开的DataFrame上进行groupBy(index)过滤,其中每个索引的n() 等于预期的项目数列表并继续在Spark DataFrame上执行其他groupBy,merge,join,filter等操作。

Urban Institute的GitHub页面上有一些很好的指南。祝好运。 -nate