将Hive查询导出为CSV

时间:2017-12-24 21:19:23

标签: csv hadoop hive export hiveql

我正在尝试将查询从Hive导出到本地CSV。同样的错误仍然存​​在,任何帮助将不胜感激!

命令:

insert overwrite local directory '/path/to/directory' 
row format delimited fields terminated by ',' select * from table limit 10;

错误:

errorMessage:org.apache.spark.sql.catalyst.parser.ParseException:
`missing 'TABLE' at 'local'

提前谢谢。

4 个答案:

答案 0 :(得分:1)

Hive可以使用OpenCSVSerde在HDFS中将表数据存储为CSV。您可以在hdfs文件夹上创建要在其中显示CSV文件的表格:

CREATE EXTERNAL TABLE `csv_export`(
 wf_id string,
 file_name string,
 row_count int
)
COMMENT 'output table'
ROW FORMAT SERDE
  'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
  'escapeChar'='\\',
  'quoteChar'='\"',
  'separatorChar'=',')
STORED AS INPUTFORMAT
  'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  '/user/admin/export/folder';

然后,您可以使用所需的任何选择查询数据:

INSERT INTO csv_export SELECT a, b, c FROM source_table;

INSERT INTO SELECT语句可能是查找数据质量问题的复杂联接。结果输出将是不良记录。

OpenCSVSerde将为同一语句中插入的行再创建一个文件:

hdfs dfs -ls /user/admin/export/folder
Found 2 items
-rwx------   3 admin admin        885 2020-04-29 05:24 /user/admin/export/folder/000000_0

您可以将单个文件下载到磁盘并重命名:

hdfs dfs -copyToLocal /user/admin/export/folder/000000_0
mv 000000_0 output.cvs

如果有大量数据,您将获得多个文件,因此将文件夹中的所有文件都整理到本地文件中更安全

hdfs dfs -cat '/user/admin/export/folder/*' > output.cvs

结果output.csv将使用正确的CSV数据格式。

答案 1 :(得分:0)

您可以从命令行执行HIVE查询,并将输出通过管道传输到文件中。

hive -e "select * from table limit 10" > /path/to/directory/file.tsv

不幸的是,这将为您提供一个制表符分隔值文件。我还没有找到更改分隔符的方法,但您可以对文件进行处理。

答案 2 :(得分:0)

这就是我在Hive 1.2(MapR发行版)中所做的工作,并且通过2个步骤对我来说非常有效:

第1步::在配置单元状态下或在命令行中使用hive -e选项时执行此操作:

INSERT OVERWRITE LOCAL DIRECTORY '/path/to/directory/'
          ROW FORMAT DELIMITED
          FIELDS TERMINATED BY ','
          LINES TERMINATED BY '\n'
          STORED AS TEXTFILE
          select * from table1  limit 1000 ;

第2步::在命令行上,使用hadoop fs命令将此文件移动到所需目录。

hadoop fs -cat /path/to/directory/*  >  /path/to/directory2/table1_small.csv

或者您甚至可以这样做:

hadoop fs -text /path/to/directory/*  >  /path/to/directory2/table1_small.csv

在上面的示例中,directory和directory2是不同的位置。如果您有任何问题,请告诉我。

答案 3 :(得分:0)

您可以从命令行执行以下操作:

$ beeline --silent=true -u jdbc:hive2://localhost:10000  --outputformat=csv2 --showHeader=false -e 'SELECT * FROM table'