3

我在 SparkR 中有一个 DataFrame 类型的数据集“数据”。例如,我想获得条目号 50。在 RI 中只需键入data[50,],但是当我在 sparkR 中执行此操作时,我会收到此消息

“错误:'S4' 类型的对象不是子集”

我能做些什么来解决这个问题?

此外:如何向数据添加一列(具有相同的列大小)?

4

2 回答 2

4

你唯一能做的就是

all50 <- take(data,50)
row50 <- tail(all50,1)

SparkR 没有 row.names,因此您不能对索引进行子集化。这种方法有效,但您不想在大型数据集上使用它。

你的问题的第二部分也是不可能的。您只能根据数字(例如常量列)或通过对属于您的 DataFrame 的列进行转换来添加列。这实际上已经在如何绑定 sparkR 中的两个数据框列?.

于 2015-07-28T12:59:22.617 回答
3

取决于先前的转换顺序RDDs,其中的值是 Spark 数据帧后面的数据容器,不能保证。除非您明确对数据进行排序,例如使用orderBy询问第 n 行甚至没有意义。

如果将显式顺序和一点原始 SQL 结合起来,则可以选择一行,如下所示:

sqlContext <- sparkRHive.init(sc)
df <- createDataFrame(sqlContext, mtcars)
registerTempTable(df, "df")

# First lets order data frame and add row number
df_ordered <- sql(
     sqlContext,
    "SELECT *, row_number() OVER (ORDER BY wt) as rn FROM df")

# It could be done with using nested SQL but where is more convinient
head(where(df_ordered, df_ordered$rn == 5))

请注意,窗口函数需要HiveContext. 您在 shell 中获得的默认sparkRSQL上下文SparkR将不起作用。

值得注意的是,Spark 数据帧(与任何 RDD 相同)在设计时并未考虑到随机访问,并且出于某种原因,诸如单值/行访问之类的操作并不明显。对大型数据集进行排序是一个昂贵的过程,如果没有特定的分区器来提取单个数据集,可能需要整个 RDD 扫描。

于 2015-07-28T13:39:51.277 回答