使用spark / scala,我使用saveAsTextFile()到HDFS,但是hiveql(“ select count(* from ...)从...)返回0

多吉尔
  • 我创建了外部表,如下所示...

    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中将scala与saveAsTextFile()一起使用,如下所示... 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.

  • 帮我该怎么办。谢谢。

罗纳克帕特尔

您将火花保存在错误的位置。分区目录名称紧随其后part_col_name=part_value

在Spark中:将文件保存part_date=2016%2F07%2F19temp_tabledir下的目录中

itemsRdd.map(_.makeTsv)
.saveAsTextFile("hdfs://work/temp_db/temp_table/part_date=2016%2F07%2F19")

添加分区:您将需要添加应更新配置单元表的元数据的分区(我们从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()之后添加分区,并注意sinalter语句即可。它需要在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在添加分区时会创建目录(如果不存在)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

Related 相关文章

热门标签

归档