某位用户试图构建一个shiny app,该app能够接受来自用户的输入文件,对该输入文件执行一些hive查询,然后将查询结果作为附件通过电子邮件发送给用户。
该用户有两个问题:
- shiny server不属于hadoop集群,想知道在这种情况下RHIVE软件包是否能够正常工作?
- 无论是否使用RHIVE,在将查询发送到HIVE之后,如何才能在查询完成后收到通知?通常情况下,该用户会手动在Cloudera Manager中执行此类工作,并在查询运行1或2小时后回来查看结果。该用户希望使用R/Python/bash来自动化此过程。如果必须在Python/bash中完成与HIVE的连接,他将尝试在其shiny app中调用Python和bash脚本来自动化此过程。
2. 解决方案
2.1 RHIVE软件包的问题
RHIVE软件包是一个R包,可用于与Apache Hive进行交互。它允许R用户执行Hive查询、创建和删除表以及加载和卸载数据。
RHIVE软件包可以在shiny server上使用,即使该server不属于hadoop集群。这是因为RHIVE软件包使用JDBC连接到Hive,JDBC是一种独立于平台的数据库连接API。
2.2 查询完成通知的问题
有几种方法可以在查询完成后收到通知。一种方法是使用Hive的异步查询功能。异步查询允许用户提交查询并继续执行其他任务,而无需等待查询完成。当查询完成后,用户可以通过轮询查询状态或订阅查询完成通知来收到通知。
另一种方法是使用调度程序来安排查询。调度程序可以配置为定期运行查询,并在查询完成后发送电子邮件或其他类型的通知。
2.3 代码示例
以下是一个使用RHIVE软件包在shiny app中执行Hive查询并通过电子邮件发送结果的代码示例:
# 导入必要的库
library(shiny)
library(RHIVE)
# 创建一个新的shiny app
ui <- fluidPage(
titlePanel("Hive查询"),
sidebarLayout(
sidebarPanel(
fileInput("file", "选择文件", accept = ".csv")
),
mainPanel(
verbatimTextOutput("result")
)
)
)
# 定义server函数
server <- function(input, output) {
# 响应文件输入
observeEvent(input$file, {
# 从输入文件中读取数据
data <- read.csv(input$file$datapath)
# 将数据加载到Hive表中
hive_load(data, "my_table")
# 执行Hive查询
result <- hive_query("SELECT * FROM my_table")
# 将查询结果发送到电子邮件
send_email(result)
# 在shiny app中显示查询结果
output$result <- renderPrint(result)
})
}
# 运行shiny app
shinyApp(ui, server)
# 定义一个函数来发送电子邮件
send_email <- function(result) {
# 创建一个新的电子邮件消息
message <- MIME()
# 设置电子邮件的发件人、收件人、主题和正文
message$From <- "sender@example.com"
message$To <- "recipient@example.com"
message$Subject <- "Hive查询结果"
message$Body <- "请参见附件中的查询结果。"
# 将查询结果作为附件添加到电子邮件
message$attach(result, filename = "result.csv")
# 发送电子邮件
send.mail(message)
}
2.4 注意事项
- 在使用RHIVE软件包之前,需要在shiny server上安装JDBC驱动程序。
- 在使用Hive的异步查询功能之前,需要在Hive中启用异步查询。
- 在使用调度程序来安排查询之前,需要在调度程序中配置查询。
- 在发送电子邮件之前,需要配置SMTP服务器。