使用 SparkR 获取特定行

Get specific row by using SparkR

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

"Error: object of type 'S4' is not subsettable"

我该怎么做才能解决这个问题?

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

你唯一能做的就是

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

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

另外,您的问题的第二部分目前还无法完成。您只能根据数字(例如常量列)或通过对属于您的 DataFrame 的列进行转换来添加列。 这实际上已经在 How to do bind two dataframe columns in sparkR?.

中被问到

根据 RDDs 中值的先前转换顺序,无法保证这些值是 Spark 数据帧背后的数据容器。除非您明确订购数据,例如使用 orderBy 询问第 n 行甚至没有意义。

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

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))

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

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