在大数据公司中,任何一家公司都不会只使用一个框架吧?!
那我们今天就来聊一段 Hive 与 Spark的爱恨情仇
就像

在一些场景中,需要将外部的数据导入到Hive表中,然后再对这些数据进行额外的处理,提供给不同的部门使用。
如过看不到全文,VX搜索关注:阿布的进击
查看全部文章
当导完数据之后,需要用到Spark进行后续的处理时,发现数据多了一条
Spark:Omg,我顶你个肺~
这种情况的排查,我们需要从数据源头一步步检验,找出来这突然多出来的数据究竟是何方妖怪,想想是一件很恐怖的事情
Hive:同志,冷静
数据重复?索引重复?
俗话说不会面向度娘编程的Hive不是好Spark,在拔掉了两根头发之后发现问题:表头!
环境模拟
Centos 7
Spark 2.4.4
scala 2.11.8
JDK 1.8
Hive 1.2.2
hadoop 2.7.3
创建测试表:testTab
create table if not exists testTab( id string, name string )
row format delimited fields terminated by ","
tblproperties("skip.header.line.count"="1");
测试数据:testData.txt
id,name
1,xzheng
2,bbeir
3,hive
4,saprk
加载数据到Hive表中:
load data local inpath "/usr/local/src/testData.txt" overwrite into table testTab;
在Hive中查询:
select * from testTab;
+----------------------+------------------------+--+
| testTab.id | testTab.name |
+----------------------+------------------------+--+
| 1 | xzheng |
| 2 | bbeir |
| 3 | hive |
| 4 | spark |
+----------------------+------------------------+--+
Spark SQL查询:
+---+------+
|id |name |
+---+------+
|id |name |
| 1 |xzheng|
|2 |bbeir |
| 3 |hive |
|4 |spark |
+---+------+
解决方法-1:
在原始表的基础上,再建立一个备份表,通过Spark Sql查询结果正确
create table if not exists testTab_2
row format delimited fields terminated by ","
as
select * from testTab;
解决方法-2:
通过spark的read函数,直接操作存在hdfs上的原始数据,然后再建表
scala> val df = spark.read.format("csv").option("path","hdfs://path_to_hdfs/testData.txt").option("header",true).option("delimiter",",").load
scala> df.show()
+---+------+
|id |name |
+---+------+
|1 |xzheng|
| 2 |bbeir |
|3 |hive |
| 4 |spark |
+---+------+
请关注公众号:阿布的进击

Hive在创建表的时候可以通过增加:tblproperties("skip.header.line.count"="1") 语句来忽略第一行。
skip.heaer.line.count :跳过文件行首多少行
skip.footer.line.count :跳过文件行尾多少行
Hive中设置的忽略表头在Spark中不生效!
Hive中设置的忽略表头在Spark中不生效!
Hive中设置的忽略表头在Spark中不生效!
小秘密:
https://issues.apache.org/jira/browse/HIVE-5795
https://issues.apache.org/jira/browse/SPARK-11374
3610

被折叠的 条评论
为什么被折叠?



