我在SparkR中有一个DataFrame类型的数据集“data”。
我想以50号条目为例。
在R中我只需输入data[50,]
但是当我在sparkR中执行此操作时,我收到此消息
“错误:'S4'类型的对象不是子集”
我该怎么做才能解决这个问题?
此外:如何向数据添加列(具有相同列大小)?
答案 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扫描。