在大数据公司中,任何一家公司都不会只使用一个框架吧?!
skr,skr~~
那我们今天就来聊一段 Hive 与 Spark的爱恨情仇
就像
在一些场景中,需要将外部的数据导入到Hive表中,然后再对这些数据进行额外的处理,提供给不同的部门使用。
当导完数据之后,需要用到Spark进行后续的处理时,发现数据多了一条
Spark:Omg,我顶你个肺~
这种情况的排查,我们需要从数据源头一步步检验,找出来这突然多出来的数据究竟是何方妖怪,想想是一件很恐怖的事情
Hive:同志,冷静
数据重复?索引重复?
俗话说不会面向度娘编程的Hive不是好Spark,在拔掉了两根头发之后发现问题:表头!
02
我不能干涉被测试框架的客观性
环境模拟
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");
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_2row 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 | +---+------+
我的青春真实存在过
skip.heaer.line.count :跳过文件行首多少行
skip.footer.line.count :跳过文件行尾多少行
Hive中设置的忽略表头在Spark中不生效!
Hive中设置的忽略表头在Spark中不生效!
Hive中设置的忽略表头在Spark中不生效!
05
你人性深处隐藏了很多小秘密
小秘密:
https://issues.apache.org/jira/browse/HIVE-5795
https://issues.apache.org/jira/browse/SPARK-11374
有不同看法,下方留言讨论,别让你的小秘密淹没在未知里
我也该咽下这根美好的鱼骨头了
文章评论