使用 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 扫描。
我在 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 扫描。