使用 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

您从 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 创建目录(如果不存在) ) 添加分区时。