如何将数据从 CSV 加载到 impala 的外部表中

Posted

技术标签:

【中文标题】如何将数据从 CSV 加载到 impala 的外部表中【英文标题】:How to load data from CSV into an external table in impala 【发布时间】:2020-09-03 03:40:34 【问题描述】:

我正在关注 this 将外部表加载到 Impala 的解决方案,因为如果我通过引用文件来加载数据,则会遇到相同的错误。

所以,如果我跑:

[quickstart.cloudera:21000] > create external table Police2 (Priority string,Call_Type string,Jurisdiction string,Dispatch_Area string,Received_Date string,Received_Time int,Dispatch_Time int,Arrival_Time int,Cleared_Time int,Disposition string) row format delimited
                            > fields terminated by ',' 
                            > STORED as TEXTFILE
                            > location '/user/cloudera/rdpdata/rpd_data_all.csv' ;

我明白了:

Query: create external table Police2 (Priority string,Call_Type string,Jurisdiction string,Dispatch_Area string,Received_Date string,Received_Time int,Dispatch_Time int,Arrival_Time int,Cleared_Time int,Disposition string) row format delimited
fields terminated by ','
STORED as TEXTFILE
location '/user/cloudera/rdpdata/rpd_data_all.csv'
ERROR: ImpalaRuntimeException: Error making 'createTable' RPC to Hive Metastore: 
CAUSED BY: MetaException: hdfs://quickstart.cloudera:8020/user/cloudera/rdpdata/rpd_data_all.csv is not a directory or unable to create one

如果运行以下命令,则不会导入任何内容。

[quickstart.cloudera:21000] > create external table Police2 (Priority string,Call_Type string,Jurisdiction string,Dispatch_Area string,Received_Date string,Received_Time int,Dispatch_Time int,Arrival_Time int,Cleared_Time int,Disposition string) row format delimited
                            >  fields terminated by ',' 
                            > location '/user/cloudera/rdpdata' ;
Query: create external table Police2 (Priority string,Call_Type string,Jurisdiction string,Dispatch_Area string,Received_Date string,Received_Time int,Dispatch_Time int,Arrival_Time int,Cleared_Time int,Disposition string) row format delimited
 fields terminated by ','
location '/user/cloudera/rdpdata'
Fetched 0 row(s) in 1.01s

以及文件夹的内容

[cloudera@quickstart ~]$ hadoop fs -ls /user/cloudera/rdpdata
Found 1 items
-rwxrwxrwx   1 cloudera cloudera   75115191 2020-09-02 19:36 /user/cloudera/rdpdata/rpd_data_all.csv

以及文件的内容:

[cloudera@quickstart ~]$ hadoop fs -cat  /user/cloudera/rdpdata/rpd_data_all.csv
1,EMSP,RP,RC, 03/21/2013,095454,000000,000000,101659,CANC

以及cloudera quickstart vm的截图

【问题讨论】:

似乎这不可能在 Impala 中完成,但建议的语法在 Hive 中工作正常,所以我可以访问 Impala 中的数据,有人可以确认 Impala 中没有这个,那会很棒(如果真的是这样的话) 在位置仅提供直到文件夹名称。 HDFS 自动检测文件夹中的文件,例如位置'/user/cloudera/' 【参考方案1】:

impala create table 语句中的 location 选项决定了存储数据文件的 hdfs_path 或 HDFS 目录。尝试提供目录位置而不是文件名,以便您使用现有数据。

供您参考:https://impala.apache.org/docs/build/html/topics/impala_tables.html

【讨论】:

谢谢,但这也不起作用,在问题中添加了更多信息 成功了,看来“fetched 0”是骗人的!选择按预期返回数据,谢谢

以上是关于如何将数据从 CSV 加载到 impala 的外部表中的主要内容,如果未能解决你的问题,请参考以下文章

将数据加载到 Hive/Impala

如何将 TIMESTAMPS 格式转换为与 Impala 兼容

从分区文件结构创建 Impala 外部表

Impala 外部表读取未压缩文件但具有名称 (*.csv.gz)

将数据从 HDFS 加载到 Kudu

将 CSV 文件从 Google Drive 加载到 BigQuery