Hive 结果未保存到 S3 存储桶中

Posted

技术标签:

【中文标题】Hive 结果未保存到 S3 存储桶中【英文标题】:Hive results not being saved into S3 bucket 【发布时间】:2017-06-09 00:47:25 【问题描述】:

我无法将 Hive 输出保存到 S3。我已经尝试sshing 进入主节点并在 Hive 中运行我的命令,但它不保存输出。我还尝试从 AWS 的 EMR 控制台运行 Hue 中的命令,但它仍然没有保存到 S3。我还添加了脚本作为一个步骤,但它仍然没有保存。我能够获得结果的唯一方法是在 Hue 中运行它,然后单击查看结果并以这种方式下载,然后将它们推送到 S3。我不知道为什么会这样。这是我正在运行的查询。

with temp as (
select /*+ streamtable(l) */ a.id, a.name, a.page
from my_table a
join my_other_table l on (a.id = l.id)
group by a.page, a.id, a.name)
insert overwrite directory 's3://bucket/folder/folder2/folder3/folder4/folder5/folder6/folder7/'
select page, count(distinct id) over (PARTITION BY page)
from temp
group by page;

作为说明,我希望解决方案在添加步骤时起作用,因为我计划按顺序添加x 步骤数。

【问题讨论】:

【参考方案1】:

我看到 Amazon EMR 输出到 Amazon S3 的正常方式是在 Amazon S3 中使用 CREATE EXTERNAL TABLE 发送到 LOCATION

例如:

CREATE EXTERNAL TABLE IF NOT EXISTS output_table
(gram string, year int, ratio double, increase double)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE
LOCATION 's3://my-bucket/directory';

然后,只需将INSERT 数据放入该表:

INSERT OVERWRITE TABLE output_table
SELECT gram FROM table...

【讨论】:

您提供的第一个 sn-p 代码从位置 S3 在 Hive 中创建了一个表,这是正确的,是的,这就是我从 S3 中的数据创建表的方式。我想从 Hive ----> S3 出发。据我所知,查询的前缀是insert overwrite directory,后跟 S3 存储桶。 上述语法有效。您只需 INSERT 到表中,它就会被写入 S3。【参考方案2】:

我找到了解决办法。

问题是S3 位置中的斜杠,您希望覆盖的目录的基本路径应该包含斜杠。

【讨论】:

以上是关于Hive 结果未保存到 S3 存储桶中的主要内容,如果未能解决你的问题,请参考以下文章

定期将查询结果从 Redshift 移动到 S3 存储桶

如何将弹性搜索索引的响应保存到 s3 存储桶中

S3 存储桶中的 AWS Lambda 代码未更新

如何同时将视频上传到 s3 为其创建缩略图并使用 nodejs 将其保存到同一存储桶中的另一个文件夹中?

如何使用scala和aws-java-sdk从S3存储桶中获取所有S3ObjectSummary?

将对象保存在具有公共访问权限的 AWS S3 存储桶中