我知道在Hive中将表保存到csv(或其他文本文件)时,分隔符存在已知问题。所以我想知道你们是否可以帮我解决这个问题。
我有一个现有的表(表A),我想将它以csv格式保存到hdfs。从阅读其他回复我相信我必须首先创建一个外部表(但我不确定整个事情的样子)。
有人可以帮忙吗?
答案 0 :(得分:11)
在hive shell中试试这个:
INSERT OVERWRITE LOCAL DIRECTORY '/path/to/hive/csv' ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' SELECT * FROM hivetablename;
将/path/to/csv
更改为要存储csv文件的位置。您的hive表格hivetablename
将以csv格式存储。
答案 1 :(得分:4)
这个三步过程对我来说很好:
,创建一个存储为textfile的新临时表
CREATE TABLE temp_table( id INT, name STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS TEXTFILE;
in HIVE ,将源数据写入临时表
INSERT OVERWRITE TABLE temp_table
SELECT id, name FROM source_table;
从命令行,将Hive表从HDFS中的位置复制到本地文件 - 检查应将文件显示为csv(如果需要,重新命名)
hdfs dfs -copyToLocal /apps/hive/warehouse/temp_table/* /tmp/local_dir/
如果您在HIVE 中运行SHOW CREATE TABLE temp_table
命令,它会告诉您HDFS中表格的确切位置,例如:
| LOCATION |
| 'hdfs://hadoop_cluster/apps/hive/warehouse/temp_table' |
答案 2 :(得分:1)
对于配置单元中的外部表,您可以按照以下步骤操作:
在配置单元中创建外部表
CREATE EXTERNAL TABLE external_table(数字INT,名称STRING)行格式删除字段终止于',' LOCATION' / user / hive / external / mytable /';
<强> 2。将数据文件从本地加载到HDFS位置
hadoop fs -put /home/user1/Desktop/filename.csv /user/hive/external/mytable/
以上两个步骤可以解决您的问题。
答案 3 :(得分:0)
您可以遵循的3个步骤:-
创建一个临时表
DROP TABLE IF EXISTS Test;
CREATE TABLE Test
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n' AS
SELECT * FROM ABC #OR whole query statements
从创建的配置单元表中创建一个CSV
hive -e 'set hive.cli.print.header=true; select * from Test' | sed 's/[\t]/,/g' > /home/hadoop/Mycsv.csv
将创建的CSV
文件放置到您想要的任何位置的S3
hdfs dfs -put -f /home/hadoop/Mycsv.csv 's3://bucketName/'