无法将数据从 parquet 文件加载到外部配置单元 table
unable to load data from parquet files to hive external table
我在下面编写了 scala 代码来创建 parquet 文件
scala> case class Person(name:String,age:Int,sex:String)
defined class Person
scala> val data = Seq(Person("jack",25,"m"),Person("john",26,"m"),Person("anu",27,"f"))
data: Seq[Person] = List(Person(jack,25,m), Person(john,26,m), Person(anu,27,f))
scala> import sqlContext.implicits._
import sqlContext.implicits._
scala> import org.apache.spark.sql.SaveMode
import org.apache.spark.sql.SaveMode
scala> df.select("name","age","sex").write.format("parquet").mode("overwrite").save("sparksqloutput/person")
HDFS 状态:
[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
然后我使用下面的命令创建了一个外部配置单元table
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
但是 运行 以上 select 查询没有返回任何行。请有人帮忙。
通常,hive sql 语句 'select * from <table>'
只是定位 table 目录,其中存在 table 数据,并从 hdfs
目录转储文件内容。
在您的情况下,select *
不起作用,这意味着位置不正确。
请注意,在 Scala 中,您的最后一条语句包含 save("sparksqloutput/person")
,其中 "sparksqloutput/person"
是相对路径,它将扩展为 "/user/<logged in username>/sparksqloutput/person"
(即 "/user/cloudera/sparksqloutput/person"
)。
因此,在创建配置单元 table 时,您应该使用 "/user/cloudera/sparksqloutput/person"
而不是 "/sparksqloutput/person"
。实际上 "/sparksqloutput/person"
不存在,因此您在 select * from person
中没有得到任何输出。
我在下面编写了 scala 代码来创建 parquet 文件
scala> case class Person(name:String,age:Int,sex:String)
defined class Person
scala> val data = Seq(Person("jack",25,"m"),Person("john",26,"m"),Person("anu",27,"f"))
data: Seq[Person] = List(Person(jack,25,m), Person(john,26,m), Person(anu,27,f))
scala> import sqlContext.implicits._
import sqlContext.implicits._
scala> import org.apache.spark.sql.SaveMode
import org.apache.spark.sql.SaveMode
scala> df.select("name","age","sex").write.format("parquet").mode("overwrite").save("sparksqloutput/person")
HDFS 状态:
[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
然后我使用下面的命令创建了一个外部配置单元table
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
但是 运行 以上 select 查询没有返回任何行。请有人帮忙。
通常,hive sql 语句 'select * from <table>'
只是定位 table 目录,其中存在 table 数据,并从 hdfs
目录转储文件内容。
在您的情况下,select *
不起作用,这意味着位置不正确。
请注意,在 Scala 中,您的最后一条语句包含 save("sparksqloutput/person")
,其中 "sparksqloutput/person"
是相对路径,它将扩展为 "/user/<logged in username>/sparksqloutput/person"
(即 "/user/cloudera/sparksqloutput/person"
)。
因此,在创建配置单元 table 时,您应该使用 "/user/cloudera/sparksqloutput/person"
而不是 "/sparksqloutput/person"
。实际上 "/sparksqloutput/person"
不存在,因此您在 select * from person
中没有得到任何输出。