我正在尝试将查询从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'
提前谢谢。
答案 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'