使用 spark/scala,我使用 saveAsTextFile() 到 HDFS,但是 hiveql("select count(*) from...) return 0
Using spark/scala, I use saveAsTextFile() to HDFS, but hiveql("select count(*) from...) return 0
我创建了外部 table 如下...
hive -e "create external table temp_db.temp_table (a char(10), b int) PARTITIONED BY (PART_DATE VARCHAR(10)) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS TEXTFILE LOCATION '/work/temp_db/temp_table'"
我在 IntelliJ IDEA 中将 saveAsTextFile() 与 scala 一起使用,如下所示...
itemsRdd.map(_.makeTsv).saveAsTextFile("hdfs://work/temp_db/temp_table/2016/07/19")
所以文件(以'\t'结尾的字段)在/work/temp_db/temp_table/2016/07/19.
hadoop fs -ls /work/temp_db/temp_table/2016/07/19/part-00000 <- data file..
但是,我用hiveql查了一下,没有如下数据。
hive -e "select count(*) from temp_db.temp_table" -> 0.
hive -e "select * from temp_db.temp_table limit 5" -> 0 rows fetched.
帮我看看该怎么做。谢谢
您从 spark 保存到错误的位置。分区目录名称遵循 part_col_name=part_value
.
在 Spark 中:将文件保存在目录 part_date=2016%2F07%2F19
下的 temp_table
目录下
itemsRdd.map(_.makeTsv)
.saveAsTextFile("hdfs://work/temp_db/temp_table/part_date=2016%2F07%2F19")
添加分区:您将需要添加分区以更新配置单元 table 的元数据(我们从 spark 创建的分区目录符合配置单元预期的 key=value
格式)
alter table temp_table add partition (PART_DATE='2016/07/19');
[cloudera@quickstart ~]$ hadoop fs -ls /user/hive/warehouse/temp_table/part*|awk '{print $NF}'
/user/hive/warehouse/temp_table/part_date=2016%2F07%2F19/part-00000
/user/hive/warehouse/temp_table/part_date=2016-07-19/part-00000
查询分区数据:
hive> alter table temp_table add partition (PART_DATE='2016/07/19');
OK
Time taken: 0.16 seconds
hive> select * from temp_table where PART_DATE='2016/07/19';
OK
test1 123 2016/07/19
Time taken: 0.219 seconds, Fetched: 1 row(s)
hive> select * from temp_table;
OK
test1 123 2016/07/19
test1 123 2016-07-19
Time taken: 0.199 seconds, Fetched: 2 row(s)
对于日常流程:您可以像这样 运行 saprk 作业 - 只需在 saveAsTextFile()
之后添加分区,同时注意 alter
语句中的 s
。需要从 spark:
传递 hive sql 中的变量
val format = new java.text.SimpleDateFormat("yyyy/MM/dd")
vat date = format.format(new java.util.Date())
itemsRDD.saveAsTextFile("/user/hive/warehouse/temp_table/part=$date")
val hive = new HiveContext(sc)
hive.sql(s"alter table temp_table add partition (PART_DATE='$date')")
注意: 保存文件后添加分区,否则 spark 将抛出目录已存在异常,因为 hive 创建目录(如果不存在) ) 添加分区时。
我创建了外部 table 如下...
hive -e "create external table temp_db.temp_table (a char(10), b int) PARTITIONED BY (PART_DATE VARCHAR(10)) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS TEXTFILE LOCATION '/work/temp_db/temp_table'"
我在 IntelliJ IDEA 中将 saveAsTextFile() 与 scala 一起使用,如下所示...
itemsRdd.map(_.makeTsv).saveAsTextFile("hdfs://work/temp_db/temp_table/2016/07/19")
所以文件(以'\t'结尾的字段)在
/work/temp_db/temp_table/2016/07/19. hadoop fs -ls /work/temp_db/temp_table/2016/07/19/part-00000 <- data file..
但是,我用hiveql查了一下,没有如下数据。
hive -e "select count(*) from temp_db.temp_table" -> 0. hive -e "select * from temp_db.temp_table limit 5" -> 0 rows fetched.
帮我看看该怎么做。谢谢
您从 spark 保存到错误的位置。分区目录名称遵循 part_col_name=part_value
.
在 Spark 中:将文件保存在目录 part_date=2016%2F07%2F19
下的 temp_table
目录下
itemsRdd.map(_.makeTsv)
.saveAsTextFile("hdfs://work/temp_db/temp_table/part_date=2016%2F07%2F19")
添加分区:您将需要添加分区以更新配置单元 table 的元数据(我们从 spark 创建的分区目录符合配置单元预期的 key=value
格式)
alter table temp_table add partition (PART_DATE='2016/07/19');
[cloudera@quickstart ~]$ hadoop fs -ls /user/hive/warehouse/temp_table/part*|awk '{print $NF}'
/user/hive/warehouse/temp_table/part_date=2016%2F07%2F19/part-00000
/user/hive/warehouse/temp_table/part_date=2016-07-19/part-00000
查询分区数据:
hive> alter table temp_table add partition (PART_DATE='2016/07/19');
OK
Time taken: 0.16 seconds
hive> select * from temp_table where PART_DATE='2016/07/19';
OK
test1 123 2016/07/19
Time taken: 0.219 seconds, Fetched: 1 row(s)
hive> select * from temp_table;
OK
test1 123 2016/07/19
test1 123 2016-07-19
Time taken: 0.199 seconds, Fetched: 2 row(s)
对于日常流程:您可以像这样 运行 saprk 作业 - 只需在 saveAsTextFile()
之后添加分区,同时注意 alter
语句中的 s
。需要从 spark:
val format = new java.text.SimpleDateFormat("yyyy/MM/dd")
vat date = format.format(new java.util.Date())
itemsRDD.saveAsTextFile("/user/hive/warehouse/temp_table/part=$date")
val hive = new HiveContext(sc)
hive.sql(s"alter table temp_table add partition (PART_DATE='$date')")
注意: 保存文件后添加分区,否则 spark 将抛出目录已存在异常,因为 hive 创建目录(如果不存在) ) 添加分区时。