Выходные данные Beeline поступают в формате JSON вместо таблицы CSV - PullRequest
0 голосов
/ 14 сентября 2018

При использовании запроса Beeline, как показано ниже, базовые данные, хранящиеся в HDFS, поступают с сервера мэйнфрейма. Все, что я хочу, это выполнить запрос и вывести его в CSV (или любой табличный формат):

beeline -u 'jdbc:hive2://server.com:port/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2;transportMode=binary' -–showHeader=false --outputformat=csv2 -e "SELECT * FROM tbl LIMIT 2;"> tables1.csv

Мои проблемы:

The format is not clean, there are extra rows at top and bottom ;
It appears as JSOn and not a table.
Some numbers seem hexadecimal    format.

+-----------------------------------------------------------------------------------------------------------------------------+
|  col1:{"col1_a":"00000"   col1_b:"0"  col1_c:{"col11_a":"00000"   col11_tb:{"mo_acct_tp":"0"  col11_c:"0"}}   col1_d:"0"}|  
+-----------------------------------------------------------------------------------------------------------------------------+

Я хочу обычный csv с именами столбцов сверху и без вложенности.

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Пожалуйста, помогите нам лучше понять ваши данные.

Есть ли в вашей таблице данные, подобные приведенным ниже, когда вы выполняете запрос на выборку в Билайн или в улье?:

> select * from test;
+------------------------------------------------------------------------------------------------------------------------+--+
|                                                        test.col                                                        |
+------------------------------------------------------------------------------------------------------------------------+--+
| {"col1_a":"00000","col1_b":"0","col1_c":{"col11_a":"00000","col11_tb":{"mo_acct_tp":"0","col11_c":"0"}},"col1_d":"0"}  |
+------------------------------------------------------------------------------------------------------------------------+--+

Еслида, вам, возможно, придется проанализировать данные из объектов Json, как показано ниже:

select
get_json_object(tbl.col, '$.col1_a') col1_a
, get_json_object(tbl.col, '$.col1_b') col1_b
, get_json_object(tbl.col, '$.col1_c.col11_a') col1_c_col11_a 
, get_json_object(tbl.col, '$.col1_c.col11_tb.col11_c') col1_c_col11_tb_col11_c
, get_json_object(tbl.col, '$.col1_c.col11_tb.mo_acct_tp') col1_c_col11_tb_mo_acct_tp
, get_json_object(tbl.col, '$.col1_d') col1_d
from test tbl
INFO  : Completed executing command(queryId=hive_20180918182457_a2d6230d-28bc-4839-a1b5-0ac63c7779a5); Time taken: 1.007 seconds
INFO  : OK
+---------+---------+-----------------+--------------------------+-----------------------------+---------+--+
| col1_a  | col1_b  | col1_c_col11_a  | col1_c_col11_tb_col11_c  | col1_c_col11_tb_mo_acct_tp  | col1_d  |
+---------+---------+-----------------+--------------------------+-----------------------------+---------+--+
| 00000   | 0       | 00000           | 0                        | 0                           | 0       |
+---------+---------+-----------------+--------------------------+-----------------------------+---------+--+
1 row selected (2.058 seconds)

Затем вы можете использовать этот запрос в командной строке для экспорта результатов в файл.

>beeline -u 'jdbc:hive2://server.com:port/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2;transportMode=binary' --showHeader=false --outputformat=csv2 -e "select
get_json_object(tbl.col, '$.col1_a') col1_a
, get_json_object(tbl.col, '$.col1_b') col1_b
, get_json_object(tbl.col, '$.col1_c.col11_a') col1_c_col11_a 
, get_json_object(tbl.col, '$.col1_c.col11_tb.col11_c') col1_c_col11_tb_col11_c
, get_json_object(tbl.col, '$.col1_c.col11_tb.mo_acct_tp') col1_c_col11_tb_mo_acct_tp
, get_json_object(tbl.col, '$.col1_d') col1_d
from corpde_commops.test tbl;" > test.csv

Если вам нужны имена столбцов в файле, включите --showHeader = true

Окончательный вывод будет:

>cat test.csv 
col1_a,col1_b,col1_c_col11_a,col1_c_col11_tb_col11_c,col1_c_col11_tb_mo_acct_tp,col1_d
00000,0,00000,0,0,0

Я явно не вижучто-то не так в вашем заявлении beeline.

Если ваши данные не соответствуют приведенному выше примеру, решение может быть иным.

Всего наилучшего.

0 голосов
/ 15 сентября 2018

Вам нужно сделать showHeader=true и вы получите желаемый результат

beeline -u 'jdbc:hive2://server.com:port/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2;transportMode=binary' -–showHeader=true --outputformat=csv2 -e "SELECT * FROM tbl LIMIT 2;"> tables1.csv

Вы также можете попробовать формат таблицы, outputformat=table, это не даст CSV в качестве вывода, но даст вам чистую табличную структуру, как показано ниже:

+-----+---------+-----------------+
| id  |  value  |     comment     |
+-----+---------+-----------------+
| 1   | Value1  | Test comment 1  |
| 2   | Value2  | Test comment 2  |
| 3   | Value3  | Test comment 3  |
+-----+---------+-----------------+
...