我在 SparkR 中有一个 DataFrame 类型的数据集“数据”。例如,我想获得条目号 50。在 RI 中只需键入data[50,]
,但是当我在 sparkR 中执行此操作时,我会收到此消息
“错误:'S4' 类型的对象不是子集”
我能做些什么来解决这个问题?
此外:如何向数据添加一列(具有相同的列大小)?
我在 SparkR 中有一个 DataFrame 类型的数据集“数据”。例如,我想获得条目号 50。在 RI 中只需键入data[50,]
,但是当我在 sparkR 中执行此操作时,我会收到此消息
“错误:'S4' 类型的对象不是子集”
我能做些什么来解决这个问题?
此外:如何向数据添加一列(具有相同的列大小)?
你唯一能做的就是
all50 <- take(data,50)
row50 <- tail(all50,1)
SparkR 没有 row.names,因此您不能对索引进行子集化。这种方法有效,但您不想在大型数据集上使用它。
你的问题的第二部分也是不可能的。您只能根据数字(例如常量列)或通过对属于您的 DataFrame 的列进行转换来添加列。这实际上已经在如何绑定 sparkR 中的两个数据框列?.
取决于先前的转换顺序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 扫描。