如何将HiveQL查询的结果输出到CSV?
我们想把一个Hive查询的结果放到一个CSV文件中。 我以为这个命令应该是这样的:
insert overwrite directory '/home/output.csv' select books from table;
当我运行它,它说它completeld成功,但我永远不能find该文件。 我如何find这个文件,或者我应该以不同的方式提取数据?
谢谢!
尽pipe可以使用INSERT OVERWRITE
从Hive中获取数据,但对于您的特定情况,这可能不是最好的方法。 首先让我解释一下INSERT OVERWRITE
function,然后介绍用于从Hive表中获取tsv文件的方法。
根据手册 ,您的查询将数据存储在HDFS目录中。 格式不会是csv。
写入文件系统的数据被序列化为文本,用^ A分隔的列和用换行符分隔的行。 如果任何列不是原始types,那么这些列将被序列化为JSON格式。
稍加修改(添加LOCAL
关键字)将数据存储在本地目录中。
INSERT OVERWRITE LOCAL DIRECTORY '/home/lvermeer/temp' select books from table;
当我运行一个类似的查询时,输出如下所示。
[lvermeer@hadoop temp]$ ll total 4 -rwxr-xr-x 1 lvermeer users 811 Aug 9 09:21 000000_0 [lvermeer@hadoop temp]$ head 000000_0 "row1""col1"1234"col3"1234FALSE "row2""col1"5678"col3"5678TRUE
就我个人而言,我通常在命令行上直接通过Hive来运行我的查询,并将其input到本地文件中,如下所示:
hive -e 'select books from table' > /home/lvermeer/temp.tsv
这给了我一个可以使用的制表符分隔的文件。 希望对你有用。
基于这个补丁-3682 ,我怀疑使用Hive 0.11时有更好的解决scheme,但我无法自己testing。 新的语法应该允许以下内容。
INSERT OVERWRITE LOCAL DIRECTORY '/home/lvermeer/temp' ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' select books from table;
希望有所帮助。
如果你想要一个CSV文件,那么你可以修改Lukas的解决scheme如下(假设你在一个Linux机器上):
hive -e 'select books from table' | sed 's/[[:space:]]\+/,/g' > /home/lvermeer/temp.csv
您应该使用CREATE TABLE AS SELECT(CTAS)语句在HDFS中创build一个包含查询结果的文件。 之后,您将不得不将这些文件从HDFS导出到常规磁盘,并将它们合并到一个文件中。
您也可能必须做一些诡计来转换文件从\ 001' – 分隔到CSV。 您可以使用自定义CSV SerDe或后处理提取的文件。
如果你正在使用HUE,这也相当简单。 只需转到HUE中的Hive编辑器,执行您的configuration单元查询,然后将结果文件保存为XLS或CSV,或者可以将结果文件保存到HDFS。
我正在寻找类似的解决scheme,但这里提到的解决scheme是行不通的。 我的数据有空白(空格,换行符,制表符)字符和逗号的所有变化。
为了使列数据tsv安全,我使用空格replace列数据中的所有字符,并在命令行上执行python代码以生成csv文件,如下所示:
hive -e 'tab_replaced_hql_query' | python -c 'exec("import sys;import csv;reader = csv.reader(sys.stdin, dialect=csv.excel_tab);writer = csv.writer(sys.stdout, dialect=csv.excel)\nfor row in reader: writer.writerow(row)")'
这创build了一个完全有效的csv。 希望这有助于那些来寻找这个解决scheme。
您可以使用configuration单元string函数CONCAT_WS( string delimiter, string str1, string str2...strn )
例如:
hive -e 'select CONCAT_WS(',',cola,colb,colc...,coln) from Mytable' > /home/user/Mycsv.csv
您可以使用INSERT
… DIRECTORY
…,如下例所示:
INSERT OVERWRITE LOCAL DIRECTORY '/tmp/ca_employees' SELECT name, salary, address FROM employees WHERE se.state = 'CA';
OVERWRITE
和LOCAL
与之前有相同的解释,path按照通常的规则解释。 一个或多个文件将写入/tmp/ca_employees
,具体取决于调用的reducer的数量。
我有类似的问题,这是我能够解决这个问题。
步骤1 – 将Hive表中的数据加载到另一个表中,如下所示
DROP TABLE IF EXISTS TestHiveTableCSV; CREATE TABLE TestHiveTableCSV ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' AS SELECT Column List FROM TestHiveTable;
步骤2 – 将Hive仓库中的blob复制到新位置,并进行适当的扩展
Start-AzureStorageBlobCopy -DestContext $destContext -SrcContainer "Source Container" -SrcBlob "hive/warehouse/TestHiveTableCSV/000000_0" -DestContainer "Destination Container" -DestBlob "CSV/TestHiveTable.csv"
默认分隔符是“ ^A
”。 在Python语言中,它是“ \x01
”。
当我想更改分隔符时,我使用SQL如下所示:
SELECT col1, delimiter, col2, delimiter, col3, ..., FROM table
然后,将分隔符+“ ^A
”作为新的分隔符。