对于Spark和SparkR来说,我相当新,可能会有一些基本问题。
本练习的目的是在SparkR中实现窗口函数(超前,滞后,排名等)。
我提到了下面的链接以及那里提到的Databricks帖子,但没有用 -
我使用的代码段:
初始化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存储中的数据而不是集群内存。
非常感谢您的帮助! 谢谢!
答案 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