为什么Window函数(Lag)在SparkR中不起作用?

时间:2015-11-07 09:01:55

标签: sql r apache-spark apache-spark-sql sparkr

对于Spark和SparkR来说,我相当新,可能会有一些基本问题。

本练习的目的是在SparkR中实现窗口函数(超前,滞后,排名等)。

我提到了下面的链接以及那里提到的Databricks帖子,但没有用 -

SparkSQL - Lag function?

我使用的代码段:

初始化sqlContext并使用将临时表注册为数据帧 Registertemptable

output_data<-SparkR::sql(sqlContext, "select *,lag(type) over(partition by key order by key) as lag_type from input_data")

我们遇到的错误是:

failure: ``union'' expected but `(' found

我发现另一个建议是使用 Hivecontext而不是SQLcontext作为SQLcontext 可能不允许所有功能。

在该方法中,初始化Hivecontext并尝试运行HiveQL 做同样的事情给我们一个错误说:

cannot find table named input_table

问题:我们是否需要运行类似于registertemptable的命令才能允许Hivecontext访问该表?

saveastable 可能是一个选项,但从我读到的内容来看,它会收集S3存储中的数据而不是集群内存。

非常感谢您的帮助! 谢谢!

1 个答案:

答案 0 :(得分:1)

让我们使用freeny数据集准备输入data.frame

ldf <- freeny

# Extract year and quater
ldf$yr <- as.integer(rownames(ldf))
ldf$qr <- as.integer(4 * (as.numeric(rownames(ldf)) - ldf$yr))

# Clean column names
colnames(ldf) <- gsub("\\.", "_",  colnames(ldf))

# Drop a couple of things so output fits nicely in the code box
row.names(ldf) <- NULL
ldf$market_potential <- NULL

head(ldf)


##         y lag_quarterly_revenue price_index income_level yr   qr
## 1 8.79236               8.79636     4.70997      5.82110 1962      1
## 2 8.79137               8.79236     4.70217      5.82558 1962      2
## 3 8.81486               8.79137     4.68944      5.83112 1962      3
## 4 8.81301               8.81486     4.68558      5.84046 1963      0
## 5 8.90751               8.81301     4.64019      5.85036 1963      1
## 6 8.93673               8.90751     4.62553      5.86464 1963      2
  

我发现另一个建议是使用Hivecontext而不是SQLcontext作为SQLcontext可能不允许所有功能。

这是正确的,大多数高级功能仅由HiveContext支持,而默认值为SQLContext。首先,您必须确保已使用Hive支持构建Spark版本。关于Spark downloads page提供的二进制文件的确如此,但如果您从源代码构建,请务必使用-Phive标记。

hiveContext <- sparkRHive.init(sc)
sdf <- createDataFrame(hiveContext, ldf)
printSchema(sdf)

## root
##  |-- y: double (nullable = true)
##  |-- lag_quarterly_revenue: double (nullable = true)
##  |-- price_index: double (nullable = true)
##  |-- income_level: double (nullable = true)
##  |-- yr: integer (nullable = true)
##  |-- qr: integer (nullable = true)
  

初始化sqlContext并使用Registertemptable

将数据帧注册为临时表

这也是正确的。为了能够使用sql命令,您已经注册了一个表。

registerTempTable(sdf, "sdf")

请记住,DataFrame绑定到用于创建它的上下文。

head(tables(hiveContext))

##  tableName isTemporary
## 1       sdf        TRUE

head(tables(sqlContext))

## [1] tableName   isTemporary
## <0 rows> (or 0-length row.names)

最后的示例查询:

query <- "SELECT yr, qr, y, lag_quarterly_revenue AS old_lag,
          LAG(y) OVER (ORDER BY yr, qr) AS new_lag 
          FROM sdf"

sql(hiveContext, query)

##     yr qr       y old_lag new_lag
## 1 1962  1 8.79236 8.79636      NA
## 2 1962  2 8.79137 8.79236 8.79236
## 3 1962  3 8.81486 8.79137 8.79137
## 4 1963  0 8.81301 8.81486 8.81486
## 5 1963  1 8.90751 8.81301 8.81301
## 6 1963  2 8.93673 8.90751 8.90751