如何从beeline hive以csv2格式下载数据?

Posted

技术标签:

【中文标题】如何从beeline hive以csv2格式下载数据?【英文标题】:How to download data from beeline hive in csv2 format? 【发布时间】:2018-09-30 13:14:29 【问题描述】:

我在通过直线从 hive 下载数据时遇到问题。

我想将表格下载到以 csv 作为字段分隔符的文件中。如果列值有逗号,则该值需要用引号括起来。

我知道 beeline 为这个用例提供了输出格式 csv2。

但我没有得到预期的结果。

为此,我创建了包含数据的示例表。

    0: jdbc:hive2://ip:10000/default> DESC samp_ret;
+-------------+------------+----------+--+
|  col_name   | data_type  | comment  |
+-------------+------------+----------+--+
| intvar      | int        |          |
| stringvar1  | string     |          |
| stringvar2  | string     |          |
+-------------+------------+----------+--+
3 rows selected (0.081 seconds)
0: jdbc:hive2://ip:10000/default>  SELECT * FROM samp_ret ;
+------------------+----------------------+----------------------+--+
| samp_ret.intvar  | samp_ret.stringvar1  | samp_ret.stringvar2  |
+------------------+----------------------+----------------------+--+
| 1                | one,ONE              | One                  |
| 2                | 2                    | Two                  |
| 3                |                      | Three                |
| 4                | four,FOUR            |                      |
| 5                | five'FIVE            | Five                 |
| 6                | six',SIX             | Six                  |
+------------------+----------------------+----------------------+--+
6 rows selected (0.164 seconds)

我正在尝试将此数据下载到应用服务器,但由于某种原因,我没有看到包含逗号的记录。

使用的直线命令是,

beeline -u jdbc:hive2://ip:10000/default?zeroDateTimeBehavior=round -n yumecorp yumehive org.apache.hive.jdbc.HiveDriver --showHeader=false --outputformat=csv2 --silent -e "SELECT * FROM dev.samp_ret " > /tmp/samp_ret.out

输出是,

正如你在输出中看到的,如果列值有逗号,那么它显示为 ^@

如果我在这里遗漏了什么,请告诉我。

【问题讨论】:

【参考方案1】:

在执行直线命令之前在 shell 中导出以下属性

bash$ export HADOOP_CLIENT_OPTS="-Ddisable.quoting.for.sv=false"

然后执行直线导出命令

beeline -u jdbc:hive2://ip:10000/default?zeroDateTimeBehavior=round -n yumecorp yumehive org.apache.hive.jdbc.HiveDriver --showHeader=false --outputformat=csv2 --silent -e "SELECT * FROM dev.samp_ret " > /tmp/samp_ret.out

示例:

之后我在一个表中有 2 个字符串列

hive> select * from i;
+-------+---------+--+
| i.id  | i.name  |
+-------+---------+--+
| 1     | kl,kl   |
| 2     | ll,mm   |
+-------+---------+--+

现在导出到 csv 文件,其中包含 名称列值

bash$ export HADOOP_CLIENT_OPTS="-Ddisable.quoting.for.sv=false"
bash$ beeline --showHeader=false --outputformat=csv2 --silent -e "SELECT * FROM default.i" > samp_ret.out
bash$ cat samp_ret.out 
1,"kl,kl"
2,"ll,mm"

请参阅此hive Jira 了解更多详情。

【讨论】:

谢谢。我最初沿着直线命令尝试它似乎不起作用。现在说得通了。

以上是关于如何从beeline hive以csv2格式下载数据?的主要内容,如果未能解决你的问题,请参考以下文章

减少 Beeline Hive CSV 的详细程度

hive beeline详解

使用beeline shell拒绝用户匿名的Hive权限

从 Beeline 连接时,Hive 查询在 Tez 上失败,但在 Map-Reduce 上成功

hivehive的安装配置,beeline使用

Hive Beeline 官方文档学习