使用SparkR获取特定行

时间:2015-07-28 12:44:05

标签: r apache-spark sparkr

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

  

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

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

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

2 个答案:

答案 0 :(得分:3)

你唯一能做的就是

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

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

你问题的第二部分还不可能。您只能根据数字(例如常量列)添加列,或者通过对属于您的DataFrame的列进行转换。 这实际上已在How to do bind two dataframe columns in sparkR?中提出。

答案 1 :(得分: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。 <{1}} shell中的默认sparkRSQL上下文不起作用。

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