无法从镶木地板文件加载数据到hive外部表

时间:2017-08-15 06:17:13

标签: hive apache-spark-sql parquet bigdata

我在下面写了scala代码来创建镶木地板文件

[cloudera@quickstart ~]$ hadoop fs -ls sparksqloutput/person
Found 4 items
-rw-r--r--   1 cloudera cloudera          0 2017-08-14 23:03 sparksqloutput/person/_SUCCESS
-rw-r--r--   1 cloudera cloudera        394 2017-08-14 23:03 sparksqloutput/person/_common_metadata
-rw-r--r--   1 cloudera cloudera        721 2017-08-14 23:03 sparksqloutput/person/_metadata
-rw-r--r--   1 cloudera cloudera        773 2017-08-14 23:03 sparksqloutput/person/part-r-00000-2dd2f334-1985-42d6-9dbf-16b0a51e53a8.gz.parquet

HDFS状态:

hive> CREATE EXTERNAL TABLE person (name STRING,age INT,sex STRING) STORED AS PARQUET LOCATION '/sparksqlouput/person/';
OK
Time taken: 0.174 seconds
hive> select * from person
    > ;
OK
Time taken: 0.125 seconds

然后我使用下面的命令

创建了一个外部配置单元表
template {
source = "Template/template.ctmpl"
destination = "F:\\IDE\\Visual Studio Collection\\Web Servers\\nginx-
1.12.0\\nginx-1.12.0\\conf\\nginx.conf"
command = "\"F:\\IDE\\Visual Studio Collection\\Web Servers\\nginx-
1.12.0\\nginx-1.12.0\\nginx\" -s reload"
command_timeout = "60s"
}

但是在上面运行select查询时没有返回任何行。请有人帮忙解决这个问题。

1 个答案:

答案 0 :(得分:1)

通常,hive sql语句'select * from <table>'只是定位表数据所在的表目录,并从该hdfs目录转储文件内容。

在您的情况下select *无效,则表示位置不正确。

请注意,在scala中,您的上一个语句包含save("sparksqloutput/person"),其中"sparksqloutput/person"是相对路径,它将扩展为"/user/<logged in username>/sparksqloutput/person"(即"/user/cloudera/sparksqloutput/person")。

因此,在创建配置单元表时,您应使用"/user/cloudera/sparksqloutput/person"而不是"/sparksqloutput/person"。实际上"/sparksqloutput/person"不存在,因此您在select * from person中没有获得任何输出。